Встраивание точки входа 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);
};
Спасибо!
Решение
Нет. WinMain
не может быть членом класса как «вход» точки программы. И в этом отношении, WinMain
не может быть в любом пространстве имен (кроме глобального пространства имен). Например, даже user::WinMain
как показано ниже не может быть «входом» точкой программы.
namespace user
{
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}
Точка входа программы должно быть Определено в глобальном пространстве имен.
Тем не менее, вы можете выполнить функцию с этим именем внутри класса (или в каком -либо другом пространстве имен), которое вы можете позвонить из действительный точка входа WinMain
Определено в глобальном пространстве имен. НоcApp::WinMain
(или же user::WinMain
) никоим образом не является точкой «входа» программы.
Другие советы
Во-первых, это (и WndProc) должно было бы быть static
участники должны соответствовать требуемым прототипам.Реальная проблема заключается в том, чтобы заставить компилятор привязываться к отсутствующей глобальной функции, для этого вам нужно использовать опцию компоновщика, такую как msvc /entry:<symbol>
попробовать привязку к статическому члену класса, однако это может привести к ошибке в разрешении области видимости...Если у вас не может быть статических элементов, вы можете использовать запись CRT winmain для создания экземпляра вашего объекта, а затем вызвать его WinMain
функция участника, ofc, в этом случае вы, возможно, не сможете напрямую привязаться к стандартным библиотекам, и вам нужно будет выполнить инициализацию CRT самостоятельно (хотя это можно получить из источника crt msvc)