2012-01-30 65 views
12

私は多くのモーダルダイアログを使用していて、AFX_MANAGE_STATEを使わずに正常に動作しましたが、最近はリソースDLLが起動時とは異なる別のプロジェクトで作業していましたdll。私はウェブをサーフィンして上記の行を見つけ、ダイアログを起動する前にそれを挿入すると効果があった。私たちはさまざまなDLLを持っているので、ダイアログを起動するためにメインdllの状態をロードする必要がありますが、わかりません。私はどこでもインターネット上で良い説明を見つけることができませんでした。誰も簡単な言葉で説明してください。AFX_MANAGE_STATEと私は突然それを使用しなければなりませんでした。AFX_MANAGE_STATE(AfxGetStaticModuleState())が正確に行うのは

ありがとうございました。

+0

Microsoftテクニカルノート058、MFCモジュール状態の実装には、AFX_MANAGE_STATEの使用に関するいくつかの追加情報があります。 https://msdn.microsoft.com/en-us/library/vstudio/ft1t4bbc(v=vs.100).aspx少し古いかもしれませんが。 –

答えて

17

すべての.exeと.dllには、内部リソースハンドルがあり、ダイアログやその他のリソースを指しています。 DLLで関数を呼び出すと、現在のリソースハンドルが.exe内のリソースを指しています。これは間違っており、DLLのリソースに変更する必要があります。

これはAFX_MANAGE_STATEの機能です。

14

AFX_MANAGE_STATEは、特定の関数が呼び出されるEXE/DLLではなく、このDLL内でのみリソースが参照されるようにリソース関数を呼び出すマクロです。このマクロはまた、AFX_MAINTAIN_STATEクラスをスタックに配置します。このクラスは、関数の終了時にリソースルックアップをリセットするので、このエクスポートされた関数を呼び出したEXE/DLLはリソース検索を元に戻します。 C++用語で

// Some exported function that launches GUI or uses other resources 
int GetSomething() 
{ 
    AFX_MANAGE_STATE(); 
    ... 
} 

は何か(ない正確に)のようになる:同じDLL呼び出しスタック内のこのマクロの

int GetSomething() 
{ 
     SetResourceSearchingToThisDLL(); 

     AFX_MAINTAIN_STATE state_RAII; 

     //Use resource 

     // Compiler will put destroctor call for state_RAII object here 
     // which will mean AFX_MAINTAIN_STATE::~AFX_MAINTAIN_STATE() 
     // And that would call something like: 
     ResetResourceSearching(); 
} 

使用法は、文句を言わない資源探索するので、誰も傷つけには、使用カウンタがいくつかあります。これは、呼び出し元(DLL/EXEリソース)が0になった場合にのみ復帰します。

重要な点は、すべてのMFC DLLはこのマクロを使用する必要があります。 DLLが非MFCクライアントによって読み込まれ、Cクライアント、C++コンソールベースのアプリケーション、.NETクライアントなどである場合のみです(はい、MFC Windowsアプリケーションクライアントでも可能です)。

EXEとDLLが同じMFC /コンパイラ/リンカバージョンを使用してMFCで作成され、1つのCWinAppオブジェクトを持つ場合、このマクロを使用する必要はありません。

関連する問題