3

私が直面している問題は、基本的にここで説明されています。つまり、次のとおりです。

  • サードパーティのインプロセス COM コンポーネント dll を使用している DLL があります。
  • そのインプロセス コンポーネントで登録不要の COM を使用したい。
  • この DLL (メインの EXE ではなく) にマンフェストを埋め込んで使用したいので、サードパーティのコンポーネントを reg フリーの方法で使用できます。
  • コンポーネントから使用するインターフェイスは、 への呼び出しによってアクティブ化されCoCreateInstanceます。
  • サード パーティの COM コンポーネントには、それ以上の (COM) 依存関係がなく、分離に依存したり、分離を必要としたりしません。

リンクされた質問で説明されているように、マニフェストを DLL に埋め込むだけでは機能しないことがわかります。アクティベーション コンテキストを手動で切り替える必要があります。

私が理解していないのは、いつどこでアクティベーション コンテキストを切り替える必要があるかということです: への呼び出しを(*) のCoCreateInstanceようなものでラップするだけでよいですか、それともすべての呼び出しをサード パーティ コンポーネントにラップする必要がありますか? (私が理解している限り、それは助けになるはずです。)CActCtxActivator ScopedContextISOLATION_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

4

1 に答える 1

2

CoCreateInstanceサードパーティ コンポーネントには他に依存関係がないため、への呼び出しをラップするだけで済みます。

他の依存関係がある場合は、呼び出しをサードパーティ コンポーネントにラップする必要があります。

于 2013-10-10T15:32:28.317 に答える