私はMFCと戦い、DLLをLoadLibraryと動的にリンクしています。私は、アプリケーションがDLLを呼び出すと、MFCの状態を取得することができないと思われ、DLLは同じ呼び出しでコールバックします。最終的に、それは数多くの主張につながる。DLLがLoadLibraryを通じて呼び出されたときにMFCの状態が無効になる
ここでは、私がやっていることのコードモックアップです。
アプリケーションは、ウィザードMFCアプリからまっすぐです。私はどこかのボタンを持っているし、これは、ボタンのハンドラである:
void callback() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CDialog1 dlg; dlg.DoModal(); } typedef void (*TPluginMainFunc)(void*); void CTheApp1View::OnTestRun1() { static HMODULE hPluginMFCShared = LoadLibrary(_T("PluginMFCShared")); if (hPluginMFCShared) { TPluginMainFunc func = (TPluginMainFunc) GetProcAddress(hPluginMFCShared, "plugin_main"); if (func) { func(callback); } } }
次に「PluginMFCShared」は次のようになります。
typedef void (*TFunc)(); extern "C" void GS_EXTERNAL_ENTRY plugin_main(TFunc func) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); func(); CDialog1 dlg; dlg.DoModal(); }
ので、アイデアがあることアプリです(CTheApp1View :: OnTestRun1)は、ライブラリをロードし、コールバックポインタを直接渡す関数を呼び出します。ライブラリはそのコールバックを使用して、アプリケーションから何かを実行してから続行します。
私はAFX_MANAGE_STATEがMFC状態を処理すると思っていましたが、それ以上の処理が必要なようです。 SystemOfPlugins.zip
任意のアイデア:
テストプロジェクトは、(TheApp1プロジェクトが立ち上げたプロジェクトに設定されていることを確認してください)で発見されるだろうか?
ありがとうございます。
DLLial、アプリケーション、またはその両方でCDialog1が定義されていますか?両方の場所で使用しているように見えますが、これは問題になります。 'DoModal'はどこに定義されていても必要です。 –
はい、CDialog1は、アプリケーションとDLLで別々に定義されており、全く異なるダイアログリソースです。 2つのプロジェクト(アプリケーションとDLL)には何も共通点がありません。コードスニペットは、その事例を示すためのものです。 –