【问题标题】:How to use wxTheApp macro outside the module it is declared?如何在声明的模块之外使用 wxTheApp 宏?
【发布时间】:2010-03-09 15:46:07
【问题描述】:

我正在使用 wxWidgets 2.8.9,在 Windows XP、VC9 下使用默认设置构建。而且我有这样的 IMPLEMENT_APP 绝对标准的 EXE:

#include <wx/wx.h>
#include <wx/image.h>
#include "MainFrame.h"

class MyMainApp: public wxApp {
public:
    bool OnInit();
};

IMPLEMENT_APP(MyMainApp)

bool MyMainApp::OnInit()
{
    wxInitAllImageHandlers();
    wxFrame* frame_mainFrame = new MainFrame(NULL, wxID_ANY, wxEmptyString);
    SetTopWindow(frame_mainFrame);
    frame_mainFrame->Show();
    return true;
}

MainFrame 是一个带有“HelloWorld”文本的 wxFrame。当一切都在 EXE 中链接时,这工作正常。问题是,我想在另一个应用程序中重用这个 MainFrame 类,因此我想把它放在一个 DLL 中,这样我就可以在任何地方使用 DLL 代码。

因为我的 DLL 与 wxWidgets 有不同的导出宏,所以我无法导出任何从我的 Dll 之外的 wxFrame 类派生的东西,所以我创建了一个工厂类,它只有一个静态方法 create(),返回 new MainFrame(NULL, wxID_ANY, wxEmptyString);

到目前为止一切顺利。我现在有一个 DLL,其中包含 MainFrame 类和一个 FrameFactory 类。只有 FrameFactory 类从我的 DLL 中导出,我可以在 EXE 中创建 MainFrame,在 OnInit() 方法中,如下所示:wxFrame* frame_mainFrame = FrameFactory::create();

问题是基类wxFrame的构造函数调用了wxTopLevelWindowMSW::CreateFrame(...),其中宏wxTheApp被调用了。这个 wxTheApp 宏实际上是对 wxApp::GetInstance() 的调用。当 MainFrame 不在 EXE 中时,我的 wxApp 实例为 NULL,我感到很惊讶。

熟悉 wxWidgets 的人可以帮助我我做错了什么吗?我做了几个实验,当使用此实例变量的代码用于不同的模块时,wxTheApp 始终为 NULL,而不是调用宏 IMPLEMENT_APP 的模块。

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    我自己不使用 wxWidgets(去 Qt!)但是您是否有任何机会将您的 DLL 静态链接到 wxWidgets,这样 EXE 和 DLL 都有自己的 lib 副本...?

    http://wiki.wxwidgets.org/Creating_A_DLL_Of_An_Application

    这可以解释为什么用于跟踪实例的 DLL 的全局变量将为空(而 EXE 是在应用程序初始化中设置的)。如果是这种情况,我会担心您的 SetInstance() 解决方法...谁知道还有哪些其他单身人士:

    When to use dynamic vs. static libraries

    【讨论】:

    • 也许我该去睡觉了……你说的完全正确。 wxWidgets 的默认构建设置会生成静态库...目前我用 DLL 构建 wxWidgets 一切正常 :) 感谢您指出这一点 :) 我用 SetInstance() 删除了我的答案,因为它完全不正确。
    • 我可能不应该到处回答关于我不使用的东西的问题。但我使用的所有事情在我完成回复之前都会得到 5 个答案。很高兴我的猜测就在这里。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多