VS2013: Aufruf von Win32 API calls bringen Compilerfehler



  • Hallo zusammen,

    ich habe in letzter Zeit einiges versucht, jedoch bekomme ich den Fehler leider einfach nicht behoben. Ich habe ein Projekt Template (VS2013 Express / Win32 API) als ZIP zusammengepackt. (Bei diesem kleinen Projekt, bereitet z.B. schon direkt am Anfang "ZeroMemory()" Compilerfehler. Gleiche Problem auch bei anderen API Calls, wie z.B. InitCommonControlsEx()

    [url=http://www.secretly.de/public/Win32 - My Empty Template.zip]Mein VS2013 Win32 Project Template (12k ZIP)[/url]



  • Ich vermute mal Du hast Dir Code aus dem Internet kopiert und dieser Code verwendet MFC. MFC ist nicht in der Express Version enthalten, sondern nur ab der Pro Version.
    Am besten ist, Du suchst dir ein Tutorial ohne MFC und fängst klein auf zu programmieren. Wenn Du schon Anfangs etwas riesiges machen willst, wird das auf Anhieb fehlschlagen.

    Hier ein Link zur MSDN: http://msdn.microsoft.com/en-s/library/windows/desktop/ff818516(v=vs.85).aspx

    Dort gibt es auch zahlreiche Samples und es ist alles dokumentiert.



  • @Hi:
    Wie Du dem Project (siehe Download-Link) entnehmen kannst, ist es ein reines Win32 Projekt und die API Befehle, bei denen der Compiler meckert, sind bekannte Win32 API Befehle - also nichts mit MFC.



  • Also ich bekomme da gar keine Compiler-Fehler. Kann es sein, dass bei der Installation von Visual Studio oder der Windows SDK Fehler aufgetreten sind?
    Ich könnte mir korrupte Header vorstellen. Ein Versuchs alles neuzuinstallieren wäre es auf jeden Fall Wert.



  • @Hi:
    Du kannst das ganze ohne Fehler Compilieren - auch wenn Du folgende Zeile im Code aktivierst?

    ZeroMemory(&wcex,sizeof(WNDCLASSEX));



  • Nein, dann nicht, aber es wird wohl daran liegen, dass du WinMainCRTStartup als Entry-Point benutzt.
    Unter anderem Funktioniert dieser Code erst gar nicht bei einem neuen Win32-Projekt.
    Ich hab jetzt nicht alle Möglichkeiten durchgeschaut, aber muss Dein Entry-Point unbeding WinMainCRTStartup sein? Hast Du da etwas spezielles vor?
    Ansonsten verwendet man die WinMain() als Entry Point.



  • @Hi:
    Vielen Dank für die Info! Ich habe den EntryPoint und /NODEFAULTLIB unter den Settings geändert.

    alt:
           int WinMainCRTStartup()
    
    neu:
    
           int WINAPI WinMain(HINSTANCE hThisInstance, 
    	    HINSTANCE hPrevInstance,
    	    LPSTR lpCmdLine,
    	    int nCmdShow)
    

    Ich kann den Source jetzt ohne Fehler kompilieren! Die WIN32 Funktion ZeroMemory() ist zwar im executeable als "memset" wiederzufinden - warum auch immer... Aber zumindest scheint es zu funktionieren! Vielen Dank! 👍



  • ZeroMemory ist ja auch nur ein (indirektes) Makro für memset (s. Community Beiträge / ZeroMemory Definition).



  • Ich verstehe den ZeroMemory-Wahn der Windows-Programmierer nicht.

    WNDCLASSEX wcex = {};

    macht das selbe, und ist mMn. viel eleganter. Und auf jeden Fall kürzer.



  • va!n schrieb:

    [url]http://www.secretly.de/public/Win32 - My Empty Template.zip[/url]

    Hab mir das Projekt mal angesehen. Das Projekt verhält sich komisch. Der Code scheint als C-Code kompiliert zu werden. Das Ändern der Endung auf cpp hat das Problem nicht gelöst.

    Der Code läuft in neu angelegtem (leeren) Projekt ohne Probleme nachdem die Änderung

    // int WinMainCRTStartup()
    int WINAPI WinMain(HINSTANCE hThisInstance, 
            HINSTANCE hPrevInstance, 
            LPSTR lpCmdLine, 
            int nCmdShow)
    

    eingebaut ist.

    Und sinnvoll wäre zudem eventuell

    // g_hInst = GetModuleHandle(0);	// Seems to return always 0x40000 !?
       g_hInst = hThisInstance;
    

    Nach ZeroMemory() kann man sich das Zuweisen von 0 auch sparen.


Anmelden zum Antworten