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