MFC DLLからダイアログを表示します
-
28-10-2019 - |
質問
フォームをロードしましたが、機能のないボタンのみをロードしました
HMODULE hModule = LoadLibrary(L"Tools.dll");
if (hModule != NULL)
{
AfxSetResourceHandle(hModule);
CDialog dgl(MAKEINTRESOURCE(199), NULL);
dgl.DoModal();
}
したがって、フォームの完全な関数をロードする方法とDLLソースコードがない方法
解決
これは、ダイアログクラスの実装がMFCベースであり、クラスがtools.dllからエクスポートされることを確信している場合にのみ可能です。 .dllで検査してみてください 依存関係ウォーカー 効用。
コンパイラマングルコンストラクター名に注意してください。これは私が次の宣言のために得たものです。
class __declspec(dllexport) TestDialog : public CDialog
{
public:
TestDialog()
:CDialog(10)
{
}
};
マングルコンストラクター名:?? _ 7testdialog @@ 6b@
おそらく、検査の結果に基づいてダイアログクラスヘッダーを再作成できるでしょう。また、Tools.dllとアプリケーションの両方で同じバージョンのMFCを持っていることを確認する必要があります。
他のヒント
からダイアログボックスを表示します MFC dll
、シナリオのように - あなたはdllでエクスポートされた関数を持っています、そしてあなたが呼び出す関数から DoModel()
このテンプレートは実際にDLLモジュールに保存されています。現在のハンドルを使用するためにモジュール状態を切り替える必要があります。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AFX_MODULE_STATE AfxGetStaticModuleState()
->The AFX_MODULE_STATE
構造には、モジュールのグローバルデータが含まれています。つまり、プッシュまたはポップされたモジュール状態の部分です。
DLLコードは次のようになります:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg objMyDlg;
iRet = objMyDlg.DoModal();
所属していません StackOverflow