我正在使用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的代码。
答案 0 :(得分:1)
我自己不使用wxWidgets(去Qt!)但你有没有机会将你的DLL静态链接到wxWidgets,这样EXE和DLL都有自己的lib副本......?
http://wiki.wxwidgets.org/Creating_A_DLL_Of_An_Application
这可以解释为什么用于跟踪实例的DLL的全局变量将为null(而在应用程序初始化中设置了EXE)。如果是这种情况,我会关注你的SetInstance()
解决方法......谁知道其他单身人士是什么: