Incorporare il punto di ingresso WinMain in una classe?
Domanda
Mi chiedevo, è possibile utilizzare il punto di ingresso di un programma win32 - WinMain - come metodo di classe? Ad esempio;
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);
};
Grazie!
Soluzione
No.WinMain
non può essere un membro della classe come punto di "ingresso" del programma.Inoltre, WinMain
non può essere in nessuno spazio dei nomi (diverso dallo spazio dei nomi globale).Ad esempio, anche user::WinMain
come mostrato di seguito non può essere il punto di "ingresso" del programma.
namespace user
{
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}
Il punto di ingresso del programma deve essere definito nello spazio dei nomi globale.
Tuttavia, puoi avere una funzione con questo nome all'interno di una classe (o in un altro spazio dei nomi), che puoi chiamare dal WinMain
del punto di ingresso effettivo definito nello spazio dei nomi globale.ButcApp::WinMain
(o user::WinMain
) non è in alcun modo il punto di "ingresso" del programma.
Altri suggerimenti
In primo luogo (e il WndProc) dovrebbero essere membri static
per abbinare i prototipi richiesti.Il vero problema è fare in modo che il compilatore si associ a una funzione non globale, per questo è necessario utilizzare un'opzione del linker come /entry:<symbol>
di msvc per provare a eseguire il binding al membro della classe statica, tuttavia potrebbe verificarsi un bug sulla risoluzione dell'ambito ... Senon puoi avere membri statici, puoi usare la voce winmain CRT per creare quindi istanza del tuo oggetto e quindi chiamare il suo membro WinMain
func, ofc potresti non essere in grado di collegarti direttamente alle librerie standard e dovrestiesegui tu stesso l'inizializzazione CRT (sebbene possa essere recuperato dal sorgente msvc crt)