如何在声明模块外使用wxTheApp宏?

时间:2010-03-09 15:46:08

标签: c++ wxwidgets

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

#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类。只从我的DLL导出FrameFactory类,我可以在EXE中,在OnInit()方法中创建MainFrame,如下所示:wxFrame* frame_mainFrame = FrameFactory::create();

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

熟悉wxWidgets的人能否帮助我做错了什么?我做了几个expreriments并且当使用此实例变量的代码在不同的模块中使用时,wxTheApp总是为NULL,而不是调用宏IMPLEMENT_APP的代码。

1 个答案:

答案 0 :(得分:1)

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

http://wiki.wxwidgets.org/Creating_A_DLL_Of_An_Application

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

When to use dynamic vs. static libraries