我使用wxWidgets 2.8.9,使用Windows XP,VC9下的默认设置构建。我有绝对的标准EXE与IMPLEMENT_APP这样的:如何在声明的模块外部使用wxTheApp宏?
#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中的所有链接都正常工作。问题是,我想在另一个应用程序中重用这个MainFrame类,因此我想将它放在一个DLL中,这样我就可以使用来自任何地方的DLL代码。
因为我的DLL有不同的出口比宏观wxWidgets,而我不能出口任何从wxFrame类派生我的DLL外面,所以我做了一个工厂类,它只是有一个静态方法创建(),返回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的人可以帮我解答我做错了什么吗?我做了几个expreriments,当使用这个实例变量的代码在不同的模块中使用时,wxTheApp总是NULL,而不是调用宏IMPLEMENT_APP的那个。
也许我应该去睡觉了......你是绝对正确的。 wxWidgets的默认构建设置会生成静态库...在构建wxWidgets的DLL时它一切正常:)感谢您指出了这一点:)我用SetInstance()删除了我的答案,因为它完全不正确。 – 2010-03-09 17:52:56
我可能不应该回答关于我不使用的东西的问题。但是,在我完成回复之前,我*所做的所有事情都会得到5个答案。很高兴我的猜测就在这里。 :) – HostileFork 2010-03-10 07:58:30