- 1 名前:デフォルトの名無しさん mailto:sage [03/05/06 11:04]
- クロスプラットフォームGUIライブラリのwxWindowsについて語りましょう。
本家 www.wxwindows.org/ dW : Linux : wxWindowsの概要 www-6.ibm.com/jp/developerworks/linux/010413/j_l-wxwin.html SunWorld Online:wxWindows――無名だが成熟したGUIツールキット www.idg.co.jp/sw/back/200102/20010219_01_report.html メルマガ www.mag2.com/m/0000108320.htm 1はこれからインストールします
- 527 名前:514 mailto:sage [03/10/12 23:42]
- >>514-515 できましたー。
これが正しい方法なのかどうか分かりませんが、 クラス名以外の情報が見えない状態でインスタンスの生成に成功しました。 以下にTipsとして示します。ちょっと長いです。 環境はWindows2000、wxWindows2.4.1です。今週中にLinuxでもやってみます。 1.DLLを用意する。 ヘッダの中身はこんな感じです。キモはDECLARE_USER_EXPORTED_PLUGGABLE_CLASSです。 これによってwxPluginLibraryにwxClassInfoのハッシュマップが宣言されます。 #ifndef MYFRAME_H #define MYFRAME_H #include <wx/wx.h> class MyFrame : public wxFrame { DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(MyFrame, __declspec(dllexport)); }; #endif で、"__declspen(dllexport)"はWXDLLEXPORTのように、 DLL側では__declspen(dllexport)、アプリケーション側では__declspen(dllimport)とならなければなりません。 wx/defs.hを見て適宜プリプロセッサで場合分けしてください。 今回はアプリケーション側はMyFrame.hをincludeしないので、このようにしました。
- 528 名前:514 mailto:sage [03/10/12 23:49]
- (続き)MyFrameはexportしなくても良いみたいです。(ひょっとすると必要なのかもしれませんが)
1.DLLを用意する(2) 今度は実装部です。IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASSを使えばいいのですが、 wxWindows2.4.1のwx/object.hの_IMPLEMENT_DL_SENTINELにバグがあり、コンパイルが通りませんので以下のようにします。 ------------------------------- #include <wx/dynload.h> #include "MyFrame.h" #undef _IMPLEMENT_DL_SENTINEL #define _IMPLEMENT_DL_SENTINEL(name) \ const wxString name::name##PluginSentinel::sm_className(#name); \ name::name##PluginSentinel::name##PluginSentinel() { \ wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes->operator[](#name); \ if( e != 0 ) { e->RefObj(); } \ } \ name::name##PluginSentinel::~name##PluginSentinel() { \ wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes->operator[](#name); \ if( e != 0 ) { e->UnrefObj(); } \ } IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(MyFrame, wxFrame); ------------------------------- ms_classes.Get(#name) となっているところを ms_classes->operator[](#name) と直します。 で、これをDLLとしてコンパイルします。
|

|