問題タブ [iunknown]
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 - .NET から COM へのイベントの公開
最近、.NET から COM にイベントを公開する際に問題が発生しています。
私はこの例で成功しました (概念的にはhttp://blogs.msdn.com/andreww/archive/2008/10/13/exposing-events-from-managed-add-in-objects.aspxから取得):
// カスタム イベントのデリゲート タイプ。
IAddInEvents インターフェイスはIDispatchとして定義されているため、これは正常に機能します。ただし、IUnknown であるイベント ソース インターフェイスを公開する必要があります。イベント インターフェイスはサード パーティのライブラリ (発行されたイベントのコンシューマーにもなります) からのものであるため、私は制御できません。イベントにフックしようとすると、VB 環境 (イベントをシンクしようとしている場所) がクラッシュし、サードパーティ製品 (ESRI ArcMap) が使用する VBA 環境もクラッシュします。
IConnectionPointContainerインターフェイス (COM がバックグラウンドでイベントを処理するために使用する) を手動で(部分的に) 実装することができたので、イベントをシンクして IConnectionPointContainer 実装にステップインすることができました。しかし、これはやり過ぎのように思えます。.NET ではこれを暗黙的にサポートする必要があると思います。第二に、このアプローチでは、デリゲートのサポートが即座に失われます。
誰もこれについて経験がありますか?前もって感謝します。
windows - QueryInterface() 実装で null ポインターをチェックする価値はありますか?
IUnknown::QueryInterface() には、取得したインターフェースを置くアドレスを示す void** パラメータが渡されます。
QueryInterface() の実装は、このポインターが null であることを確認する (そしてすぐに E_POINTER を返す) べきか、それとも単にそこに書き込むべきか?
COM 関連のコードをたくさん見てきましたが、ほとんどどこでもチェックが実行されていません。仮説的には、もちろん誰かがこのパラメーターとして null ポインターを渡すことができますが、そのようなチェックは本当に必要ですか?
c# - ウィンドウハンドルを使用してIUnkownを取得する
私はこれが長いショットかもしれないことを知っているので、私はCOMについてあまりよく知らないので私を許してください。
基本的に、私がやろうとしているのは、実行中のアプリケーションのIUnknownインターフェイスへのポインターを取得することです。問題は、アプリについて私が知っている唯一のことは、メインウィンドウのハンドルです。
これは可能でしょうか?
c# - マネージド (C#) コードでの COM "シンク" の実装
IUnknown
シンクへのを受け入れるレガシー COM コントロール (コア) があります。目的は、コアがこのシンク インターフェイスを介してデータを読み書きできるようにすることです。コア/シンク ポインターは現在、レガシー システムで使用されており、簡単に変更することはできません。
私が抱えている問題は、マネージ コードから Core を呼び出して、マネージ コードにシンクを実装しようとする (試行する) オブジェクトを渡そうとしたときです。シンクを呼び出す準備ができているところまで Core をデバッグしました。通話の前 (後ではありません) に、次のようなメッセージが表示されます。
実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした...
私は純粋なレガシ コードでこれらを確認し、実行してきましたが、マネージ コードの導入には当惑しました。
以下は、私が必要だと考える 2 つのインターフェースの最小の表現です。
IDL からのデータ アクセスの「シンク」 (問題のデモンストレーションを容易にするために縮小)
C# でシンクのさまざまな実装を試してみましたが、役に立たなかったり、エラー状態が変化したりしませんでした。これが最新の実装です。はい、タイプ lib のインターフェイス定義を使用しても機能しなかったため、インターフェイス定義を手作業でコーディングしました。(同問題)
windows - C++ で IDispatch v-table をフックする
IDispatch
システムに既に存在するインターフェイスの動作を変更しようとしています。これを行うために、私の計画は、実行時にオブジェクト v-table にフックし、代わりにカスタム フック メソッドを指すようにポインターを変更することでした。
これを機能させることができれば、既存のオブジェクトに新しいメソッドとプロパティを追加できます。良い。
IUnknown
最初に、v-table for (from which inherits from)にフックしようとしましたが、IDispatch
うまくいきました。ただし、エントリを変更しようとしてIDispatch
もまったく機能しません。何も起こりません。コードは、フックがない場合と同じように機能します。
これがコードです。非常に単純なので、理解するのに問題はないはずです
visual-studio-2008 - IID_IDXGIDevice を IUnknown::QueryDevice に渡すときの DXGI のリンカー エラー
レンダリング フレームワークでスワップチェーンとウィンドウの作成を D3D10 デバイスの作成から分離しようとしています。つまり、D3D10CreateDeviceAndSwapChain を実際に使用することはできません。テスト アプリをビルドしようとすると、予期しないリンカー エラーが発生します。
私はDXGI.hを含め、DXGI.libとD3D10ライブラリにリンクしていますが、他には何もありません。
問題のコードは次のとおりです。
if(FAILED(hr = pDXGIFactory->QueryInterface(IID_IDXGIDevice, reinterpret_cast(&pDXGIDevice)))) return hr;
私が受け取るリンカ エラーは、未解決の外部シンボルである _IID_IDXGIDevice に関連していますが、どの追加ライブラリにリンクする必要があるかについての情報が見つかりません。任意の提案をいただければ幸いです。
Win7 x64、VS2008、および DirectX SDK の最新バージョンを使用しています。
python - WDM ドライバー CreateInstance から IUnknown を取得する方法
ドキュメント (C++ の例)
私はこれを試します
IUNKNOWN と QueryInterface を取得するには?
c++ - D3D & COM の問題
すべての D3D インターフェイスは COM の IUnknown インターフェイスから派生しているため、D3D オブジェクトを解放するには簡単な方法を使用し、次のようなものを使用します。
ただし、使用しようとするとコンパイラが無効な型変換エラーを生成するため、これは機能しません。私が考えることができる唯一の方法はこれでした:
しかし、その後、いくつかの機能が失われ、見た目も非常に危険です。これを行うより良い方法はありますか?私の最初の例のように機能するものが最適ですが、マクロの使用は避けたいです(可能な場合)
com - ATL と IUnknownPtr を使用する場合のキャストの正しい方法は何ですか?
既存の ATL COM オブジェクトを変更しているときに、「The Old New Thing」ブログの「The way people mess up IUnknown::QueryInterface」という記事に出くわし、コメント セクションで議論が始まりました。回答者 (Norman Diamond) は、記事の例の 1 つで、void** へのキャストが間違っていることを指摘しました。
ただし、コードを修正してキャストを適切に実行しようとすると、メモリリークが発生します。
例は次のとおりです。
ノーマンは言った
パンクはボイドではない*. punk は IUnknown* です。
void** はユニバーサル ポインター型ではありません。void* はユニバーサル ポインター型であり、char* と相対はそのように等価になるように祖父母化されますが、void** はそうではありません。
呼び出し規則に従い、恐ろしい死を回避したい場合は、次のようにする必要があります。ボイド *パンクボイド; psf->QueryInterface(IID_IUnknown, &punkvoid); パンク = (IUnknown *) パンクボイド;
他の多くの MSDN 貢献者も同じ過ちを犯しました....現在までのすべての VC++ 実装で機能すると言う人もいるかもしれませんが、それは正しいコードにはならず、呼び出し規則にまだ違反しています。
これに照らして、古いコードを変更しました-次のとおりです。
次に、次のように変更しました。
しかし今、私のアプリケーションには、この COM オブジェクトからのメモリ リークがあります。