0

フォームを読み込んだが、機能のないボタンのみ

HMODULE hModule = LoadLibrary(L"Tools.dll");

if (hModule != NULL)
{
    AfxSetResourceHandle(hModule);
    CDialog dgl(MAKEINTRESOURCE(199), NULL);
    dgl.DoModal(); 
}

フォームの完全な機能をロードする方法と、DLL ソース コードを持っていない方法

4

2 に答える 2

2

からダイアログ ボックスを表示する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(); 
于 2014-11-11T10:41:38.567 に答える
0

これは、ダイアログクラスの実装がMFCベースであり、クラスがTools.dllからエクスポートされていることが確実な場合にのみ可能です。DependencyWalkerユーティリティを使用して.dllを検査してみてください。
コンパイラーがコンストラクター名をマングルすることに注意してください。これは私が次の宣言で得たものです。

class __declspec(dllexport) TestDialog : public CDialog
{
public:
    TestDialog()
        :CDialog(10)
    {

    }
};

壊れたコンストラクター名:?? _ 7TestDialog @@ 6B @

おそらく、検査の結果に基づいてダイアログクラスヘッダーを再作成できるでしょう。また、Tools.dllとアプリケーションの両方で同じバージョンのMFCを使用していることを確認する必要があります。

于 2011-06-16T16:51:58.277 に答える