問題タブ [activation-context-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
api - Windows XP/2003 で Excel 2007 アドイン内からアクティベーション コンテキスト API を使用できませんでしたか?
私は VS2008 を使用して Excel 2007 アドインを開発しています。アドイン内でアクティベーション コンテキスト API を使用して COM クラスをインスタンス化したいと考えています。
奇妙なことに、Windows 7 では COM クラスを正常にインスタンス化できますが、Windows XP/2003 では buf が失敗します。
ここにコードスニペットがあります
COM は C++ で記述されており、マニフェストは次のようになります。
Windows 2003/XP では、アドインが lpAssemblyDirectory で指定したディレクトリではなく、c:\program files\microsoft Office\Office 12 で ComViewer.dll を検索することがわかりました。
誰でも助けることができますか?前もって感謝します。
windows - WinForm で作業するとアクティベーション コンテキストが失われますか?
分離展開でネイティブ COM dll のいくつかのクラスを使用するアプリケーションがあります。
簡略化:
実行時に、マニフェスト ファイルを含む dll を登録せずに特定のディレクトリにダウンロードします。
次に、そのディレクトリを指すアクティベーション コンテキストを作成し、その後、dll からクラスのインスタンスを作成します。
クラスAを作成し、しばらくしてクラスBを作成するとしましょう。
この流れですべてうまくいきます。
アプリケーションを WinForm に変更したときに問題が発生しました。「ボタン 1」が押されると、前と同じようにアクティベーション コンテキストを作成し、次にクラス A のインスタンスを作成します。これはうまく機能し、フローは WinForm に戻ります。ただし、「ボタン 2」を押すと、クラス B の作成に失敗します。クラスが見つからないという例外が発生します。
そのため、WinForm が何らかの形で私のアクティベーション コンテキストを台無しにしているようです。
何故ですか?そこで何が起こっているのですか?
それを回避する方法はありますか?
いくつかのメモ:
sxstrace.exe を使用してアクティベーション コンテキストの作成を追跡しようとしましたが、アクティベーション コンテキストの作成のみがログに記録されました。
Application.EnableVisualStyles() をコメントアウトしようとしましたが、役に立ちませんでした。
アクティベーションコンテキストの作成と破棄でdllへの各呼び出しをラップすると機能しますが、当然そこに行きたくありません...
com - さまざまな場所にある多くの dll でアクティベーション コンテキスト API を使用する
場所Aで実行されている.NetクライアントでアクティベーションコンテキストAPIを使用して、場所Bにreg-freeのCOMコンポーネントをロードしています(これは、同じマシン上の兄弟/子孫などではなく、Aとは完全に異なる場所です)。 ACTCTX の場所 B を渡すと、正常に動作します。
ただし、別の COM dll を使用して同じことを行う必要があります。この COM dll は、完全に異なる場所にあるいくつかの .Net COM アセンブリに依存しています。
依存する .Net アセンブリをマニフェストに追加し、マニフェストと COM dll を場所 B に配置しましたが、依存する .Net アセンブリを場所 A (クライアントが実行される場所) に配置して動作させる必要があります。実際には、場所 A と場所 B とはまったく異なるディレクトリに存在します。
私がやろうとしていることは可能ですか?つまり、アクティベーション コンテキスト API を使用して、関連のない異なるディレクトリに複数の COM コンポーネントを読み込むことは可能ですか?
c++ - C++ コンポーネントでアクティベーション コンテキスト API を使用する
私は現在、いくつかのレガシー c++ com コンポーネントに取り組んでいる ac# 開発者です。登録せずに他の com コンポーネントを呼び出すために、アクティベーション コンテキスト API コードを com コンポーネントに追加しようとしています。
アクティベーション コンテキストを操作するダミーの C++ プロジェクトを作成しましたが、問題なく動作しました。ただし、同じコードを従来の com コンポーネントに追加すると、コンパイルすることさえできません: エラー 1 エラー C2065: 'ACTCTX' : 宣言されていない識別子
ダミー プロジェクトに特別なヘッダーを追加しませんでしたが、正常に機能したので、なぜこれが起こっているのかわかりません。うまくいけば、これはベテランの C++ 開発者にとっては些細なことです...
c++ - CreateEx 原因の未処理の例外
この行には 2 日間の労力がかかりましたが、解決策はありませんでした。itsAnalysisDataTable は、グランド グランド グランド ペアレントとして CWnd を持つカスタム ウィンドウ コントロールです。このコントロールは、コードで問題なく他のペースで正常に使用されています。これは CPropertyPage です。
私が抱えている問題は、MyProduct (x64).exe の 0x76f7fd5c で未処理の例外が発生する (そして毎回発生する) 行です。
例外は 32 ビットでも発生します。私は Windows 7 x64、VS 2008 を使用しています。
私がすでに試したこと:
- デバッガーで win32 例外のブレークを有効にします。例外は発生しません (コード内に大量に存在し、効果がない最初のチャンスの例外を除く)
- プロジェクト全体の再コンパイル
- 例外のコントロールの OnCreate ハンドラーをデバッグします。
コール スタック:
所見:
- WS_CHILD フラグをスキップすると、例外は発生しませんが、コントロールで OnCreate も呼び出されません!
- 例外を無視して続行すると、アプリケーションは正常に動作し、コントロールも正常に動作します。
- アプリの初期化中に AfxSetAmbientActCtx(FALSE) を呼び出すと、例外が抑制されます。しかし、正当化できない限り、これはハックだと思います。
c# - WebKit.NetおよびOpenWebKitSharpエラー:アクティベーションコンテキストの初期化に失敗しました
WebKit.NetとOpenWebKitSharpの両方/どちらかを使用しています。ただし、WebKitBrowserをインスタンス化しようとすると、次のエラーが発生します。アクティベーションコンテキストの初期化に失敗しました。これが何であるかを誰かが知っていますか?
com - 別のディレクトリのdllを使用したCOMサイドバイサイドアセンブリ?
答えはノーだと確信していますが、念のために:
適切なSxSマニフェストを持つスタンドアロンexeの場合、相対パスを使用してCOM DLLを参照したり、現在のディレクトリではないディレクトリからそれらをロードしたりすることはできますか?
共通フォルダーをルートとして使用して、さまざまなパッケージ(つまり、zipファイル)をデプロイするグリッド環境で動作しています。いくつかのアプリは、共通の場所から共通のCOM Api(DLLマニフェストを含む)を参照したいと考えています。ただし、グリッド環境はサンドボックス化されているため、Windows SxSディレクトリにインストールすることはできません。また、帯域外でインストールすることもできません(つまり、グリッドによって展開されません)。
.. \ SomeCommonDir \ COM.dllまたはC:\ Program Files \ SomeCommonDir \ COM.DLLからCOM.DLLをロードすると言う希望はありますか?
すべてがプライベートアセンブリとして正常に機能します。
c++ - この Windows API 呼び出し WaitForSingleObject の何が問題になっていますか?
Windows 7 でプロセスが不安定にクラッシュしました。例外の分析には!analyze -v
コマンドを使用します。WinDbg
以下の情報を伝えます。WaitForSingleObject
例外は、によって呼び出される関数によって実際にスローされIrsSim!IrsNet_BlockOutput
ます。INVALID_POINTER_READ
WinDbg の例外分析では、エラーであることがわかりました。
呼び出しコードの場合、pChannel->hMutex
は ではありませんNULL
。私はすでにそれをダンプし、その値を確認しました。
<<<<<==========
FAULTING_IP: IrsSim!Channel::SendIrsMessage+285 [s:\som5\ics\scsv\isv\test.u\irssim\irsiftransport.cpp @ 539] 00520ed5 8b06 mov eax,dword ptr [esi]
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 77db4639 (ntdll!RtlDeactivateActivationContextUnsafeFast+0x00000058)
ExceptionCode: c0150010 ExceptionFlags: 00000001 NumberParameters: 3 パラメータ [0]: 00000000 パラメータ [1]: 00007 0007DEFAULT_BUCKET_ID: INVALID_POINTER_READ
PROCESS_NAME: IrsSim.exe
ERROR_CODE: (NTSTATUS) 0xc0150010 - 非アクティブ化されているアクティブ化コンテキストは、現在の実行スレッドに対してアクティブではありません。
EXCEPTION_CODE: (NTSTATUS) 0xc0150010 - 非アクティブ化されているアクティブ化コンテキストは、現在の実行スレッドに対してアクティブではありません。
EXCEPTION_PARAMETER1: 00000000
EXCEPTION_PARAMETER2: 07befc58
EXCEPTION_PARAMETER3: 00000000
STACK_TEXT: 07d2fce0 00520ed5 irssim!Channel::SendIrsMessage+0x285 07d2fd1c 00521072 irssim!CChannelArray::SendIrsMessage+0x132 07d2fd50 0052208a irssim!CNetLibInterface::SendIrsMessage+0xba 07d2fd78 005c01b6 irssim!CSendActivity::Execute+0x76 07d2fdac 005e0b3f irssim!SimulationThreadState::ExecuteOneActivity +0x11f 07d2fdf8 005cc937 irssim!CSimulationSubThreadState::ExecuteState+0x267 07d2fe8c 005ccf02 irssim!ThreadFctSubSimulation+0xf2 07d2fec4 73b1e3ee mfc90u!_AfxThreadEntry+0xf2 07d2ff4c 739f3433 msvcr90!_endthreadex+0x44 07d2ff84 739f34c7 msvcr90!_endthreadex+0xd8 07d2ff90 767d339a kernel32!BaseThreadInitThunk+0xe 07d2ff9c 77d69ed2 ntdll !__RtlUserThreadStart+0x70 07d2ffdc 77d69ea5 ntdll!_RtlUserThreadStart+0x1b
================================
その後、!teb コマンドを使用して、さらにスタック情報を取得してみます。
0:011> k L=07beec2c 100 ChildEBP RetAddr 07bef54c 76be0bdd ntdll!NtWaitForMultipleObjects+0x15 07bef5e8 767d1a2c KERNELBASE!WaitForMultipleObjectsEx+0x100 07bef630 767d4208 kernel32!WaitForMultipleObjectsExImplementation+0xe0 07bef64c 767f80a4 kernel32!WaitForMultipleObjects+0x18 07bef6b8 767f7f63 kernel32!WerpReportFaultInternal+0x186 07bef6cc 767f7858 kernel32! WerpReportFault+0x70 07bef6dc 767f77d7 kernel32!BasepReportFault+0x20 07bef768 77da21d7 kernel32!UnhandledExceptionFilter+0x1af 07bef770 77da20b4 ntdll!__RtlUserThreadStart+0x62 07bef784 77da1f59 ntdll!_EH4_CallFilterFunc+0x12 07bef7ac 77d76ab9 ntdll!_except_handler4+0x8e 07bef7d0 77d76a8b ntdll!ExecuteHandler2+0x26 07bef7f4 77d76a2d ntdll!ExecuteHandler +0x24 07bef880 77d40143 ntdll!RtlDispatchException+0x127 07bef880 77db4639 ntdll!KiUserExceptionDispatcher+0xf 07befc34 76be0ad7 ntdll!RtlDeactivateActivationContextUnsafeFast+0x58 07befc38 76be0abc KERNELBASE!WaitForSingleObjectEx+0xde 07befc98 767d1194 KERNELBASE!WaitForSingleObjectEx+0xc3 07befcb0 767d1148 kernel32!WaitForSingleObjectExImplementation+0x75
07befcc4 005e3b6e kernel32!WaitForSingleObject+0x12
07befcd4 00520d3b IrsSim!IrsNet_BlockOutput+0x1e
07befd14 00521072 IrsSim!Channel::SendIrsMessage+0xeb 07befd48 0052208a IrsSim!CChannelArray::SendIrsMessage+0x132 07befd70 005c01b6 IrsSim!CNetLibInterface::SendIrsMessage+0xba 07befda4 005e0b3f IrsSim!CSendActivity::Execute+0x76 07befdf0 005cc937 IrsSim!SimulationThreadState::ExecuteOneActivity+0x11f 07befe84 005ccf02 IrsSim!CSimulationSubThreadState::ExecuteState+0x267 07befebc 73b1e3ee IrsSim!ThreadFctSubSimulation+0xf2 07beff44 739f3433 mfc90u!_AfxThreadEntry+0xf2 07beff7c 739f34c7 msvcr90!_endthreadex+0x44 07beff88 767d339a msvcr90!_endthreadex+0xd8 07beff94 77d69ed2 kernel32!BaseThreadInitThunk+0xe 07beffd4 77d69ea5 ntdll!__RtlUserThreadStart +0x70 07beffec 00000000 ntdll!_RtlUserThreadStart+0x1b
====================================>>>>>>
com - reg-free マネージ COM オブジェクトを作成するとき、CLR がメイン アプリケーションの実行可能ファイルとは異なるディレクトリを参照するようにするにはどうすればよいですか?
これは一種の複雑な質問であり、COM、CLR、および reg-free COM に関連するやや難解な領域に当てはまります。
まず、私のメイン アプリケーションは Python で書かれています。そのため、(開発中の) コードベースは、たとえば C:\mainapp\main.py にあります。
もちろん、Windows では、プログラムを実行するのは C:\Python27\python.exe です。
C:\mainapp\ManagedCOMObject.dll にある、私が制御する C# で記述された COM オブジェクトと通信する (IDispatch を使用して) python から reg-free COM を (win32com を使用して) 使用したいと考えています。
注: python / pythoncom を話せない場合は、Dispatch() の呼び出しが最終的に CoCreateInstance() になることに注意してください。
試行 1
結果
オブジェクトがレジストリにないため (予想どおり)、マニフェスト ファイルについては何も言及していませんでした。また、python.exe のマニフェストは明らかにオブジェクトについて認識していません。
試行 2
-
ManagedCOMObject には、clrClass タグを使用して COM オブジェクトを宣言するマニフェストが埋め込まれていることに注意してください。
結果
ActicateActCtx 呼び出しは成功し、myapp.manifest と ManagedComObject.dll のマニフェストを正しく解析します。sxstrace.exe を使用してこれを確認しました。
C:\Python27\ManagedComObject.dll をプローブした後、CoCreateInstance の呼び出しが FileNotFound で失敗します。Fusion のログは、PrivatePath が設定されていないと主張しており (python.exe.config が存在しないためと考えられます)、単純に C:\mainapp で C# オブジェクトを探しません。
質問
なぜこれが失敗するのですか?CLR COM ローダー スタブが C# アセンブリをインポートできないためだと思います。このステップの前に失敗した場合、CLR は読み込まれません。そのため、CLR が ManagedCOMObject.dll を見つけられないことが原因であると信じてしまいます。
CLR が読み込まれていることに注意してください。これは、COM が現在のアクティベーション コンテキストを正常に調べて登録を見つけたことを意味すると思います。マニフェストで clrClass が何をするのか正確にはわかりませんが、おそらく CLR が正常に読み込まれました。
問題は、アセンブリをロードするときに CLR が ActCtx に注意を払っていないことだと思います。マネージ コードを作成している場合は、AppDomain.CurrentDomain.AssemblyResolve イベントにフックして、自分で DLL を見つけることができます。代わりに、アンマネージ コードを作成し、CLR を暗黙的にのみホストしているため、アプリケーションの PrivatePath やアセンブリのプローブ方法を何らかの方法で変更できますか?
winapi - Activation Context をどこで切り替える必要がありますか?
私が直面している問題は、基本的にここで説明されています。つまり、次のとおりです。
- サードパーティのインプロセス 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