Встраивание точки входа 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)