問題タブ [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.
.net - アクティベーション コンテキストの作成に失敗する
VS 2012 .Net プロジェクトを、VS 2005 でビルドされた古いネイティブ Dll と一緒に 1 つのディレクトリに配置しようとしています。インストール上の理由から、VC Redist をユーザーのマシンにインストールすることはできません。そのため、msvcr、msvcp、msvcm、および vcomp Dll を、MS から見つけた最新の redist バージョンにそのディレクトリにも配置しました。私は.ManifestファイルMicrosoft.VC80.CRT.ManifestとMicrosoft.VC80.OpenMP.Manifestファイルをこのコンテンツで作成しました.CRT用など:
イベント ログと sxstrace を分析した結果、彼がバージョン 8.0.50608.0 を探していることがわかりました。私は 8.0.50727.6195 にリダイレクトします。
私が言ったように、eventvwr と sxstrace でいくつかの失敗を見て、それらを修正しました。現在、イベントログには何も表示されませんが、sxstrace には次のように表示されます: アクティベーション コンテキストの作成に失敗しました。理由もなく。アプリケーション自体から、Side-by-side 構成エラー メッセージ ボックスが表示されます。
全体が64ビットです。.Net アプリケーション、ラッパー、およびネイティブ DLL。
redist パッケージをインストールすると、正常に動作します。しかし、私のターゲット マシンでは、それは不可能です。
誰でもアイデアはありますか?
c++ - Win32. dll でビジュアル スタイルを有効にする
私は C++ と Win API の経験がないので、この質問がわかりにくい場合は申し訳ありません。MessageBox
たとえば、いくつかのコンポーネントを作成するDLLがあります。ビジュアル スタイルを有効にするプラグマ コメントを追加しましたが、機能しません (そして、この回答からわかるように、Internet Explorer ツールバーのコンボボックスの Windows 7 スタイル、どのように?
DLL コード (エクスポートなどは省略):
次に、アプリからこの dll 関数を呼び出します。
メッセージ ボックスはありますが、ビジュアル スタイルはありません。私が理解している限り、dll が呼び出されたときにコンテキストをアクティブにする必要がありますが、MSDN にはその方法の例がありません。そのような例を教えてください、または少なくとも何が起こっているのかをより詳細に説明していただけますか? BOOL GetCurrentActCtx(_Out_ HANDLE *lphActCtx);
関数がポインタを受け取るのに、何らかの型ACTCTX
の署名を持っている理由さえ理解できないからです。HANDLE
c# - 登録不要の COM マニフェストをネイティブ/マネージド環境で C# dll に埋め込む
私は現在、登録不要の COM を採用したネイティブ/マネージド アプリケーション チェーンの開発に取り組んでいます。次の図はこれを示しています。
C# ラッパー DLL は、tlbimp.exe ユーティリティを使用して作成されています。これにより、各 C# 実行可能ファイルが COM DLL のネイティブの型とメソッドにアクセスできるようになります。COM DLL 自体は、サーバー ベースの RegFree COM マニフェストを採用しています。
クライアント ベースの RegFree COM マニフェストが C# 実行可能ファイルに埋め込まれている場合、すべてが正常に機能します。ただし、これらのマニフェスト ファイルを C# DLL に移動して統合したいと考えています。これにより、バージョン情報の保守と同期が大幅に容易になります。
Visual Studio にはマニフェスト ファイルを C# クラス ライブラリに埋め込むオプションが用意されていないため、マニフェスト ツール (mt.exe) を使用して、DLL の既定のマニフェストを抽出、変更、および再埋め込みしようとしました。mt でクエリを実行すると、C# DLL が次のマニフェストを公開するようになったため、これはうまくいったようです。
ただし、実行可能ファイルは動作を拒否し、COM クラス ファクトリが欠落している COM モジュールを見つけることができないと不平を言っています。
ここで見落としているものはありますか?ありがとう。
c# - 登録不要の COM 相互運用性: ファイナライザーでアクティブ化コンテキストを非アクティブ化すると、SEHException がスローされる
現在、マネージド/ネイティブ ワーク チェーンが混在する作業を行っており、登録不要の COM サポート用のアクティベーション コンテキストを作成する必要があります (ネイティブ/マネージド環境で C# dll に登録不要の COM マニフェストを埋め込む を参照)。次のスニペットは、C# DLL 内のより大きなクラスの一部であり、COM ラッパーへの参照を保持し、必要なアクティベーション コンテキストを確立します。
問題は、メソッド内の pinvokedDeactivateActCtx()
関数にありDestroyActivationContext()
ます。呼び出されるとすぐにSEHException
、例外がスローされます: 外部コンポーネントが例外をスローしました。0x80004005。
Marshal.GetLastWin32Error()
関数を介して利用できるエラー コードはありません。これにより、妥当な情報が得られます。
私がこれまでに試したこと:
DestroyActivationContext()
関数をデストラクタからDispose
メソッドに、またはその逆に移動します。IDisposable
インターフェイスを完全に削除します。- 基になる COM オブジェクトのスレッド モデルを Apartment から Free に変更します。
- 入力引数として
DeactivateActCtx()
関数を提供します。DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION
IntPtr
インスタンスのタイプを に変更しますUIntPtr
。
残念ながら、これらのオプションはどれも役に立ちませんでした。前述のことに直面せずにアクティベーションコンテキストを無効にする方法はありますSEHException
か?
アップデート
ガベージコレクタのスレッドが問題の原因のようです。GC は常に独自のスレッドで実行され、他に指定する可能性は明らかではありません。DeactivateActCtx
この特定のスレッドからアクティベーション コンテキスト ( ) を非アクティブ化しようとすると、内部で何らかのアクセス違反が発生しているようです。したがって、ラップされた各呼び出しでアクティブ化コンテキストをアクティブ化および非アクティブ化する以外に、この厄介さに対処する簡単な方法はないと思います。そうでないことを証明する提案は、まだ大歓迎です。
debugging - アクティベーション コンテキスト エラー 0xC015000f のデコード
の根本原因を特定する必要がある
EXCEPTION_CODE: (NTSTATUS) 0xc015000f - 非アクティブ化されているアクティブ化コンテキストは、最近アクティブ化されたコンテキストではありません。
ユーザー モードの死後クラッシュ ダンプを使用します。
コールスタック:
それが呼び出しに渡される値0x1fb2adc6
(つまり ) であると確信していますが、コンテキスト外で非アクティブ化されている理由を判断するために次にどこに行けばよいかわかりません。ulCookie
DeleteActCtx
DeactivateActCtx( 0, 0x1fb2adc6 )
特別な例外設定でプログラムを再実行できません。お客様のインストールから受け取ったこのユーザー モードのクラッシュ ダンプだけが、私が取り組まなければならないすべてです。
からの出力に!PEB
は、環境に関する次の情報が表示されます。
c# - CreateActCtx Win32 API を使用したアクティベーション コンテキストの作成
を使用してアクティベーションコンテキストを作成しようとしていますCreateActCtx
Win32 API。この機能が使用されているコードはインターネット上にあまりありませんが、グーグルで検索した結果、これについて話している 2 つのブログを見つけることができ、ここまでたどり着きました。ただし、この API とその呼び出しフォーム .Net に関する詳細は、Google または SO のどこにもありません。奇妙だと思う理由は、私がやろうとしていることは、めったにないことですが、私の意見ではむしろ正当化されるからです。COM Dlls が実行時に決定されるフォルダーに存在する、登録不要の COM 相互運用機能を使用しようとしています。DLL が同じフォルダーにある場合、これはマニフェスト ファイルで実行できます。ただし、COM Dll が実行中のアセンブリの作業ディレクトリとは別のフォルダーにある場合は、マニフェスト ファイルを OS に明示的に提供する必要があります。実行時にフォルダーを決定する必要がある理由は、現時点では変更できないビジネス要件です。これを早く出さなければなりません。
私は Pinvoke の専門家ではないので、API から受け取ったエラー メッセージをどのようにデバッグすればよいかよくわかりません。この特定の例では、ここで説明されているように、「無効なパラメーター」であるエラー 87 が表示されます。Pinvoke の詳細を読んで、マーシャリングの目的で適切なマネージド型を使用していること、および MSDN ドキュメントに記載されているようにパラメーターを適切に使用していることを確認しました。この時点で、これをさらにデバッグする方法がよくわかりません! このメソッドがエラー メッセージを返す理由について、私は完全に迷っています。これが私のコードです(簡潔にするために、アクティブ化、リリース、およびその他の関連メソッドを削除しました):
この API を使用できるモードは 2 つあります。1 つは、EXE に埋め込まれたマニフェストを使用するか、既に個別に存在するマニフェスト ファイルを使用することです。現在、両方のメソッドがエラー メッセージを返しています。私はすでにマニフェスト ファイルの形式をテストしており、API を使用しない場合でも機能します (つまり、マニフェスト ファイルは健全です)。
これをさらにデバッグする方法についての助けをいただければ幸いです。
winsxs - 実行中のプロセスの Windows アクティベーション コンテキストを表示しますか?
実行中の Windows プロセスのアクティブ化コンテキストを表示する方法はありますか?
理想的には、「表示」と言うときは、人間が読める方法で検査することを意味します。たとえば、どの DLL がロードされているかを確認/確認するなどです。
私の想像では、ある種のデバッガーが実行中のプロセスにアタッチされ、その情報が表示される可能性があります。ただし、デバッガー、ログ ファイル、さらにはアクティベーション コンテキスト API を使用して検査するなど、あらゆる種類のツールが役立つ可能性があります。