将WinMain入口点嵌入到类中

Embedding WinMain entrypoint into a class?

本文关键字:WinMain 入口      更新时间:2023-10-16

我想知道,是否有可能使用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);
};

谢谢!

No。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成员函数,否则你可能无法直接绑定到标准库,你需要自己做CRT初始化(尽管可以从CRT msvc源中获取)