00 wxWidgets--将GUI写入DLL并在普通程序中调用

Post date: 2012/4/3 上午 05:23:41

wxWidgets是一种跨平台的GUI开发库,跟MFC非常相似,但是做了很多优化,比MFC好很多。这里不对这方面问题做过多的探讨,与果断放弃MFC并选择了wxWidgets的朋友共同进步。

wxWidgets对应MFC,也是将主函数封装到了app中,通常是自己从wxApp继承下一个类MyApp,然后用IMPLEMENT_APP(MyApp)来开启消息循环主函数等,但是如果要将GUI写入到DLL中就不能包含主函数了,为此,应该怎么将wxWidgets写入到DLL中呢?也许会想到不去定义wxApp,而只是用GUI如wxFrame,wxDialog等。如果没有wxApp是没有主函数了,但是问题又出现了,GUI的消息循环也没了,这样GUI在DLL中导出后也是不能正常工作的,开始还感觉这种设计好烂,查了好多中文资料也没有找到相关的问题,不过老外研究了这个地方,而且很惊人的发现是wxWidgets开始设计就考虑这方面问题了,人家无敌的使用了IMPLEMENT_APP_NO_MAIN(MyApp),我了个去,让我说什么好呢?好吧!你狠,你赢了!废话不多说了,直接上个例子吧!

/*********MyApp.h*************/

#ifndef __MYAPP_H__

#define __MYAPP_H__

#include <wx/app.h>

class MyApp : public wxApp

{

public:

virtual bool OnInit();

};

#endif

/**********MyFrame.h**********/

#ifndef __MYFRAME_H__

#define __MYFRAME_H__

#include <wx/frame.h>

class MyFrame : public wxFrame

{

public:

MyFrame():

wxFrame(NULL,wxID_ANY,wxT("ssss")){};

};

#endif

/****************Main.cpp****************/

#include "MyApp.h"

#include "MyFrame.h"

#include <wx/thread.h>

IMPLEMENT_APP_NO_MAIN(MyApp)

MyFrame* frame = 0;

HWND hwnd = 0;

HANDLE ThreadID = 0;

bool MyApp::OnInit()

{

frame = new MyFrame();

frame->Show(true);

return true;

}

DWORD WINAPI ThreadProc(LPVOID lpParameter)

{

wxApp::SetInstance(new MyApp());

wxEntry(GetModuleHandle(NULL),NULL,NULL,SW_SHOW);

return true;

}

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved )

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

ThreadID = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);

break;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;

case DLL_PROCESS_DETACH:

TerminateThread(ThreadID,0);

wxEntryCleanup();

break;

}

return TRUE;

}

以上是DLL部分的代码,然后自己随便写个程序LoadLibrary一下就可以看到GUI出现在调用这个DLL的程序窗口中了,剩下的事情自己来完成吧!还可以自己做进一步改进,如果还想做点别的东西,可以考虑下HOOK之DLL注入。。。