代码之家  ›  专栏  ›  技术社区  ›  m_pGladiator

如何在声明的模块外使用wxtheapp宏?

  •  0
  • m_pGladiator  · 技术社区  · 15 年前

    我使用的是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的模块。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    8 年前

    我自己不使用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