IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Compilation API Windows


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 13
    Points
    13
    Par défaut Compilation API Windows
    Bonjour,

    Je suis un transfuge de CVI6 (National Instrument). Sur ma config XP SP2 fraîche (formatée), je viens d'installer VC++Express 2005 et Microsoft Platform SDK for Windows Server 2003 R2 comme indiqué ici (http://arb.developpez.com/vc++/express/). L'essai avec l'exemple proposé se passe sans problème (HelloWorld -> CLI)

    J'ai donc voulu aller plus loin et ai essayé l'API Windows version2 (ici: http://chgi.developpez.com/windows/winmain/). Copier-coller du "code complet" (#include <windows.h> inclu bien sûr) puis F7 donnent (extrait):

    .\Winmain.cpp(22) : error C2440: '=' : cannot convert from 'const char [11]' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    J'ai casté les (3) strings avec (WCHAR*) (désolé Médinoc, c'est toi qui a raison, mais je ne savais que faire d'autre) et j'obtiens

    Linking...
    Winmain.obj : error LNK2001: unresolved external symbol __imp__ShowWindow@8
    Winmain.obj : error LNK2001: unresolved external symbol __imp__DefWindowProcW@16
    Winmain.obj : error LNK2001: unresolved external symbol __imp__LoadCursorW@8
    Winmain.obj : error LNK2001: unresolved external symbol __imp__UpdateWindow@4
    Winmain.obj : error LNK2001: unresolved external symbol __imp__PostQuitMessage@4
    Winmain.obj : error LNK2001: unresolved external symbol __imp__GetMessageW@16
    Winmain.obj : error LNK2001: unresolved external symbol __imp__RegisterClassW@4
    Winmain.obj : error LNK2001: unresolved external symbol __imp__CreateWindowExW@48
    Winmain.obj : error LNK2001: unresolved external symbol __imp__LoadIconW@8
    Winmain.obj : error LNK2001: unresolved external symbol __imp__DispatchMessageW@4
    Winmain.obj : error LNK2001: unresolved external symbol __imp__TranslateMessage@4
    MSVCRT.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main
    D:\Visual Studio 2005\Projects\TestWindow\Release\TestWindow.exe : fatal error LNK1120: 12 unresolved externals

    Bref, ma config n'est pas correcte. Oui, mais où?
    P.S. J'ai aussi essayé ça (http://texel3d.free.fr/win32/base1.htm) mais même motif, même punition...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    OK, alors:
    1. Utilise des TCHAR et la macro _T() à la place des casts. Ainsi, quand tu résussiras à compiler et linker, tu n'auras pas d'erreurs d'exécution supplémentaires.
    2. Une fois que ça compile à nouveau, on pourra s'occuper des erreurs de linkage: Je connais mal les versions Express, mais il est possible que tu doives toi-même ajouter les bibliothèques suivantes aux options d'édition de liens (Project properties -> Configuration properties -> Linker -> Input -> Additional Dependencies) :
      kernel32.lib user32.lib
      Et aussi, vérifie que c'est bien une application "Windows" et non "Console" (Project Properties -> Configuration properties -> C/C++ -> System -> Subsystem)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 13
    Points
    13
    Par défaut
    Ça progresse: les
    wc.lpszClassName = "MaWinClass";
    sont devenus des
    #include <tchar.h>
    wc.lpszClassName = (TCHAR*)_T("MaWinClass");
    et non pas des
    wc.lpszClassName = (WCHAR*)"MaWinClass";
    car ainsi ils se compilent quelque soit le type de codes caractères utilisé (ASCII 7-8 bits ou UNICODE 16 bits). C'est ça?

    D'autre part, j'ai ajouté "kernel32.lib user32.lib" sans ponctuation entre les deux dans Project -> properties -> Configuration properties -> Linker -> Input -> Additional Dependencies.
    Je n'ai pas trouvé Project -> Properties -> Configuration properties -> C/C++ -> System -> Subsystem ni aucun subsystem nulle part (dans Project -> Properties), pas plus que de choix entre Console et Windows dans Project -> Properties
    Par contre, le projet a été créé comme décrit ici (http://arb.developpez.com/vc++/expre...Lprojet-stdcpp) et F7 donne

    Linking...
    MSVCRT.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main
    D:\Visual Studio 2005\Projects\TestWindow\Release\TestWindow.exe : fatal error LNK1120: 1 unresolved externals

    Je n'ai pas trouvé comment créer d'application Windows à cet endroit là... (ajout de templates ou General -> Empty project)?
    Un idée?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 13
    Points
    13
    Par défaut Ça Marche!
    Bon, j'aurais pu essayer ça avant de poster le message précédent: j'ai créé un nouveau projet : File -> New -> Project; General, Empty Project.
    un copier-coller pour le code, à nouveau les lib kernel32.lib user32.lib et (TCHAR*)_T() comme au dessus, F7, ctrl+F5 et voilà!
    J'ai mon flocon (pour les skieurs) de programmeur API Windows

    Reste une question: comment faire pour que kernel32.lib et user32.lib fassent systématiquement partie de l'opération?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par JagV12 Voir le message
    Ça progresse: les
    wc.lpszClassName = "MaWinClass";
    sont devenus des
    #include <tchar.h>
    wc.lpszClassName = (TCHAR*)_T("MaWinClass");
    et non pas des
    wc.lpszClassName = (WCHAR*)"MaWinClass";
    car ainsi ils se compilent quelque soit le type de codes caractères utilisé (ASCII 7-8 bits ou UNICODE 16 bits). C'est ça?
    Oui, mais tu peux supprimer les casts explicites en (TCHAR*) : Le _T() suffit.
    Citation Envoyé par JagV12 Voir le message
    D'autre part, j'ai ajouté "kernel32.lib user32.lib" sans ponctuation entre les deux dans Project -> properties -> Configuration properties -> Linker -> Input -> Additional Dependencies.
    Je n'ai pas trouvé Project -> Properties -> Configuration properties -> C/C++ -> System -> Subsystem ni aucun subsystem nulle part (dans Project -> Properties), pas plus que de choix entre Console et Windows dans Project -> Properties
    Pardon, c'est dans les propriétés du linker, pas de C/C++, je m'étais trompé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/01/2013, 10h40
  2. tutoriel : La programmation de l'API Windows en C++ par Bob
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 19
    Dernier message: 21/06/2008, 14h34
  3. Erreur de compilation API windows
    Par MarioNoFearS dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2007, 08h40
  4. API windows erreur a la compilation du projet
    Par JoneZy dans le forum Windows
    Réponses: 3
    Dernier message: 25/12/2006, 23h38
  5. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo