Einbettung von WinMain -Einstiegspunkten in eine Klasse?
Frage
Ich habe mich gefragt, dass es möglich ist, den Einstiegspunkt eines Win32 -Programms - The Winmain - als Klassenmethode zu verwenden? Zum Beispiel;
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);
};
Vielen Dank!
Lösung
Nein. WinMain
kann nicht Seien Sie ein Mitglied der Klasse als "Eintragspunkt" des Programms. Und für diese Angelegenheit, WinMain
kann nicht sein in jedem Namespace (außer dem globalen Namespace). Zum Beispiel sogar user::WinMain
Wie nachfolgend dargestellt kann nicht Seien Sie der "Einstiegspunkt" des Programms.
namespace user
{
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}
Einstiegspunkt des Programms muss sein im globalen Namespace definiert.
Sie können jedoch eine Funktion mit diesem Namen in einer Klasse (oder in einem anderen Namespace) haben, den Sie von der aufrufen können tatsächlich Einstiegspunkt WinMain
im globalen Namespace definiert. AbercApp::WinMain
(oder user::WinMain
) ist in keiner Weise der "Eintrag" -Punkt des Programms.
Andere Tipps
Erstens müsste es (und das Wndproc) sein, um es zu sein static
Mitglieder entsprechen den erforderlichen Prototypen. Das eigentliche Problem besteht /entry:<symbol>
Um zu versuchen, an das statische Klassenmitglied zu binden, kann es jedoch bei der Umfangsauflösung stören ... Wenn Sie keine statischen Mitglieder haben können, können Sie den CRT -Winmain -Eintrag verwenden, um dann die Instanz Ihres Objekts zu erstellen und dann seine Rufe anzurufen WinMain
Mitgliedsfunktion, von denen Sie dann möglicherweise nicht direkt an die Standardbibliotheken binden können, und Sie müssen das CRT -Init selbst durchführen (obwohl dies aus der CRT -MSVC -Quelle abgerufen werden kann)