【发布时间】: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 的模块。
【问题讨论】: