将WinMain入口点嵌入到类中?

时间:2011-04-30 11:45:31

标签: c++ windows winapi 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 个答案:

答案 0 :(得分:4)

没有。 WinMain 不能成为该计划的“入口”点的成员。就此而言,WinMain 不能在任何名称空间中 (除了全局名称空间)。例如,即使user::WinMain如下所示也不能成为该计划的“入口”点。

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

程序的入口点必须在全局命名空间中定义。

但是,您可以在类(或其他名称空间)中使用此名称的函数,您可以从全局名称空间中定义的实际入口点WinMain调用该函数。 。但cApp::WinMain(或user::WinMain)绝不是该计划的“入口”。

答案 1 :(得分:1)

首先,它(和WndProc)需要成为static成员才能匹配所需的原型。真正的问题是让编译器绑定到一个无全局函数,因为你需要使用一个链接器选项,如msvc的/entry:<symbol>来尝试绑定到静态类成员,但它可能会在范围解析上出错...如果您不能拥有静态成员,可以使用CRT winmain条目创建对象的实例,然后调用其WinMain成员函数,然后您可能无法直接绑定到标准库,你需要自己做CRT init(尽管可以从crt msvc源获取)