【问题标题】:Embedding WinMain entrypoint into a class?将 WinMain 入口点嵌入到类中?
【发布时间】:2011-04-30 11:45:30
【问题描述】:

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

谢谢!

【问题讨论】:

  • 是的,这在技术上是可行的。修改 vc/crt/src/crtexe.c 以重命名函数并重建 CRT。当然不值得麻烦。

标签: c++ windows winapi winmain


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 2014-11-18
      • 2011-08-25
      • 2021-06-23
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多