2010-03-09 52 views
0

我使用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的那个。

回答

1

我不使用wxWidgets的自己(去Qt的!),但是你的任何机会您的DLL静态链接到wxWidgets的,使得EXE和DLL都有自己的lib的副本...?

http://wiki.wxwidgets.org/Creating_A_DLL_Of_An_Application

这可以解释为什么你的DLL的跟踪实例全局变量是空(当EXE文件是在应用程序初始化设置)。如果是这样的话,我会关心你的SetInstance()解决办法......谁知道还有什么其他的单身有:

When to use dynamic vs. static libraries

+0

也许我应该去睡觉了......你是绝对正确的。 wxWidgets的默认构建设置会生成静态库...在构建wxWidgets的DLL时它一切正常:)感谢您指出了这一点:)我用SetInstance()删除了我的答案,因为它完全不正确。 – 2010-03-09 17:52:56

+0

我可能不应该回答关于我不使用的东西的问题。但是,在我完成回复之前,我*所做的所有事情都会得到5个答案。很高兴我的猜测就在这里。 :) – HostileFork 2010-03-10 07:58:30

相关问题