Встраивание точки входа WinMain в класс? - PullRequest
0 голосов
/ 30 апреля 2011

Мне было интересно, возможно ли использовать точку входа программы win32 - WinMain - в качестве метода класса? Например;

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);
};

Спасибо! * * 1004

Ответы [ 2 ]

4 голосов
/ 30 апреля 2011

Нет.WinMain не может быть членом класса как точкой входа в программу.И в этом отношении, WinMain не может быть в любом пространстве имен (кроме глобального пространства имен).Например, даже user::WinMain, как показано ниже , не может быть точкой входа в программу.

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

Точка входа в программу должна быть определена в глобальном пространстве имен.

Однако вы можете иметь функцию с этим именем внутри класса (или в каком-либо другом пространстве имен), которую вы можете вызывать из фактической точки входа WinMainопределяется в глобальном пространстве имен.Но cApp::WinMain (или user::WinMain) никоим образом не является точкой входа в программу.

1 голос
/ 30 апреля 2011

Во-первых, он (и WndProc) должны быть static членами, чтобы соответствовать требуемым прототипам.Реальная проблема заключается в том, чтобы заставить компилятор связываться с не глобальной функцией, для этого вам нужно использовать опцию компоновщика, такую ​​как msvc /entry:<symbol>, чтобы попробовать связать статический член класса, однако это может привести к ошибке разрешения области.Если у вас не может быть статических членов, вы можете использовать запись winmain CRT, чтобы создать экземпляр вашего объекта и затем вызвать его WinMain member func, ofc, то вы, возможно, не сможете связываться напрямую со стандартными библиотеками, и вынужно выполнить инициализацию CRT самостоятельно (хотя это можно получить из источника crt msvc)

...