c ++ - Embedding WinMain entrypoint i en klasse?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg undrede mig over, er det muligt at bruge startpunktet for et win32-program - WinMain - som en klassemetode?
For eksempel;


class cApp {
public:
    cApp();
   ~cApp();

    cGuiManager* guiManager;
   cServerManager* serverManager;
    cAudioManager* audioManager;

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInst, LPSTR lpCmdLine, int nCmdShow);
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
};


Tak!

Bedste reference


Nej. WinMain kan ikke være medlem af klassen som 'indgang' punkt af programmet. Og for den sags skyld kan WinMain ikke være i ethvert navneområde (undtagen det globale navneområde). For eksempel kan selv user::WinMain som vist nedenfor ikke være 'indgangspunkt' for programmet.


namespace user
{
     int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}


Indgangspunktet for programmet skal være defineret i det globale navneområde.


Du kan dog have en funktion med dette navn inde i en klasse (eller i et andet navneområde), som du kan ringe fra faktiske indtastningspunkt WinMain defineret i det globale navneområde. Men cApp::WinMain (eller user::WinMain) på ingen måde er 'indgang' punktet af programmet.

Andre referencer 1


For det første vil det (og WndProc) være nødvendigt at være static medlemmer for at matche de nødvendige prototyper. Det reelle problem er at få kompilatoren til at binde sig til en ikke global funktion, for det skal du bruge en linker indstilling som msvc s /entry:<symbol> for at prøve at binde til det statiske klassemedlem, men det kan måske gå ud på omfangsopløsning ... Hvis du ikke kan have statiske medlemmer, kan du bruge CRT winmain-posten til at danne eksempel på dit objekt og derefter ringe til sin WinMain medlemsfunktion, eller kan du da ikke være i stand til at binde direkte til standardbibliotekerne, og du har brug for at gøre CRT init selv (selvom det kan hentes fra crt msvc-kilden)