我使用的是wxwidgets 2.8.9,它是用windows xp和vc9下的默认设置构建的。我有一个绝对标准的exe,带有如下的implement_应用程序:
#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;
}
主机是一个带有“helloworld”文本的wxframe。当所有内容都链接到EXE中时,这种方法可以正常工作。问题是,我想在另一个应用程序中重用这个大型机类,因此我想把它放在一个dll中,这样我就可以在任何地方使用dll代码。
因为我的dll有不同于wxwidgets的导出宏,所以我不能在dll之外导出任何来自wxframe类的派生,所以我创建了一个工厂类,它只有一个静态方法create(),返回
new MainFrame(NULL, wxID_ANY, wxEmptyString);
到现在为止,一直都还不错。我现在有一个dll,其中包含mainframe类,还有一个framefactory类。只有framefactory类从我的dll中导出,我可以在exe中创建大型机,在oninit()方法中,如下所示:
wxFrame* frame_mainFrame = FrameFactory::create();
问题是基类wxframe的构造函数调用wxtoplevelwindowmsw::createframe(…),其中调用了宏wxtheapp。这个wxtheapp宏实际上是对wxapp::getInstance()的调用。当大型机不在exe中时,我很惊讶wxapp实例为空。
熟悉wxwidgets的人能帮我什么忙吗?我又做了几个实验,当使用这个实例变量的代码在不同的模块中使用时,wxtheapp总是空的,而不是调用宏implement app的模块。