Встраивание точки входа WinMain в класс?

Мне было интересно, возможно ли использовать точку входа программы 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);
};

Спасибо!

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам