私が直面している問題は、基本的にここで説明されています。つまり、次のとおりです。
- サードパーティのインプロセス COM コンポーネント dll を使用している DLL があります。
- そのインプロセス コンポーネントで登録不要の COM を使用したい。
- この DLL (メインの EXE ではなく) にマンフェストを埋め込んで使用したいので、サードパーティのコンポーネントを reg フリーの方法で使用できます。
- コンポーネントから使用するインターフェイスは、 への呼び出しによってアクティブ化され
CoCreateInstance
ます。 - サード パーティの COM コンポーネントには、それ以上の (COM) 依存関係がなく、分離に依存したり、分離を必要としたりしません。
リンクされた質問で説明されているように、マニフェストを DLL に埋め込むだけでは機能しないことがわかります。アクティベーション コンテキストを手動で切り替える必要があります。
私が理解していないのは、いつどこでアクティベーション コンテキストを切り替える必要があるかということです: への呼び出しを(*) のCoCreateInstance
ようなものでラップするだけでよいですか、それともすべての呼び出しをサード パーティ コンポーネントにラップする必要がありますか? (私が理解している限り、それは助けになるはずです。)CActCtxActivator ScopedContext
ISOLATION_AWARE_ENABLED
では、登録不要の COM を使用する場合、どこでActivation Contextを切り替える必要があるのでしょうか?
(*) :または(**) または何でも。AFX_MANAGE_STATE(AfxGetStaticModuleState());
(**): 実際には、AFX_MANAGE_STATE
以前は機能していましたが、「新しい」MFC バージョンでは機能しなくなりました。たとえば、VS2012: MFC でのアクティブ コンテキスト スイッチングのサポートを削除しましたか?を参照してください。:
MFC からアクティベーション コンテキストのサポートをすべて削除しました。これは、MFC 自体の内部で Windows 分離対応 API を使用しているためです。
// 投稿者: Pat Brenner、Visual C++ ライブラリ開発: 2013 年 6 月 5 日水曜日 11:10 PM