問題タブ [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.
delphi - Delphi 6 クラス宣言でインターフェイス ポインタを割り当てますか?
何年にもわたる Delphi プログラミングにもかかわらず、IUnknown をサポートするクラスで見たことのないクラス宣言スタイルに出くわしました。
ご覧のとおり、IUnknown インターフェイス メソッドへのクラス メソッドの割り当ては、クラス宣言で直接行われています。コンストラクターが呼び出される前に、IUnknown メソッドがどのように割り当てられるかがわからないため、これは特に奇妙に見えます。これは、クラスのメソッドと、後で実行時に解決される、クラスが受け入れるインターフェイスのインターフェイス ポインターとの間の割り当てを行うためのコンパイル時のショートカットのようなものですか? これがどのように機能するか、およびこの種の構造をサポートする Delphi イディオムについて誰かが少し情報を提供できれば、私は知りたいです。
.net - .NETでのIUnknown派生ATLCOMオブジェクトの使用
私のIDL:
私のCOMクラス:
私の.NETクライアント:
クライアントは例外「System.AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました...」を受け取ります。なんで?
Visual Studio 2008、WindowsVistax64を使用しています。C ++およびC#プロジェクトにはx86構成があります。
.net - IUnknown としての 'object[]' のマネージドからアンマネージドへのマーシャリング
P/Invoke を使用して C# からアンマネージ C 関数を呼び出し、オブジェクトの配列を渡しています。アンマネージ コードでは、IDispatch に対して IUnknown をクエリします。これは単純なケースでは機能しますが、オブジェクトの 1 つが配列自体である場合、IDispatch の取得は失敗します。
マネージド コード:
アンマネージ コード:
ほとんどの場合、QueryInterface は成功します。しかし、マネージド オブジェクトが実際に「System.Object[]」である場合、IDispatch インターフェイスを取得できません (hr = 0x80004002 = E_NOINTERFACE = 「そのようなインターフェイスはサポートされていません」)。
これを修正する何らかの方法で MarshalAs(...) を使用できますか? または、これを機能させる別の方法はありますか?
silverlight - Silverlight の Marshal.GetObjectForIUnknown 代替
WPFでは、次を使用できます。
私の INuiFrameTexture は次のようになります。
今、Silverlight で同じことを達成しようとしていますが、フレームワークには GetObjectForIUnknown メソッドがありません。Silverlight でこれを行う方法があるかどうかは誰にもわかりませんか?
c# - .NET Bitmap オブジェクトを COM に渡す (DirectShow フィルタ)
一連の画像に基づいてライブ ビデオ ストリームを作成するソース フィルターを作成しようとしています。これを行うために、IUnknown のインターフェイスを作成します。
そして私のプログラムで私はそれを手に入れます:
単純な型を渡すと、すべて正常に動作します。しかし、C# Bitmap オブジェクトを渡そうとすると、エラーが発生しますunable to cast Com object to <my object type>
。または、APPCRUSH エラーでアプリケーションがシャットダウンします。
正しい方法ではないことは理解していますが、パラメーターを渡す他の方法はわかりません。IntPtr を BitmapData に渡そうとしたところ、同じアプリケーション クラッシュが発生しました。では、ビットマップを DirectShow フィルターに渡すにはどうすればよいでしょうか。
結果: コード引用の全体像については、インターフェースを作成します。
実装:
アプリケーションで:
c++ - UNKNOWN CLASS のメンバ関数への C++ ポインタ
免責事項私は使用しないか、他BOOST
のライブラリ
最後に、PointerToMemberFunctionの仕組みを学びました。これは私のコード例です。
さて、何が問題なのか。Bar::bar
実際のプロジェクトでは、どのクラスfooFnPtr
が へのポインターであるかがわからないため、何らかの方法で変更する必要があります。つまりBar::bar
、 だけでなく、どのクラスでも動作する必要がありFoo
ます。私にはわかりませんが、渡されるクラスのインスタンスへのポインタBar::bar
です。
役立つことの 1 つは、動作するすべてのクラスがBar::bar
1 つのクラスの子であることです。
これは達成可能ですか?コードを修正するにはどうすればよいですか? 前もって感謝します!
c# - IUnknownsのSAFEARRAYをインターフェイスポインターの反復可能な配列に変換/キャストします
私はC#で次のインターフェイスを使用しており、同じ名前のクラス(Iなし)を実装しています。
パブリッククラスOrder:IOrderの実装は、3つのプライベートフィールドと、必要な3つのパラメーターを持つコンストラクターです。
他の場所で、次のメソッドを使用して、COMファイルと.tlb/.tlhファイルを介してC++アンマネージコード内で作業したい結果を取得しました。
私はすでに、C#マネージコードを使用してC++アンマネージコード間で基本的な作業を行うことができました。
しかし、クラス配列は別の課題であることが証明されました...
私にとって、COMは新しく、残酷に混乱し、C ++は長い間忘れられていたことを認めます...しかし、私は両方のライブラリを開発しているので、あきらめません。C ++ DLLをプログラムとC#コード間のプロキシとして機能させたい。
明確化:私はMFCもATLも使用していません。C ++コードで#importを使用して、C#で生成されたインターフェイスとクラスポインター、およびまだ完全には理解していないその他のCOMのものを取得します。
1時間の調査の後、私はここに行って助けを求めています>。<
以下は、私が達成しようとしていることのC++コードです。
この時点で、SAFEARRAY*をIOrderPtr*などに変換するために、まだ理解していないCOMマジックが必要です。これにより、返された配列全体を反復処理して、「Order」タイプのメソッドを呼び出すことができます。
- GetQuantity()
- GetOrderType()
- GetPositionType()
したがって、最初のサイクルでは値1、2、3を取得し、2番目のサイクルでは値4、5、6を取得します。
私はC++とC#の両方のライブラリの作成者なので、このCOMのクレイジーなものをすべてスキップして、コレクション数を取得するメソッドや、特定のインデックスのプロパティの値を取得する他のメソッドを作成できます。
しかし、それは良くないようです。私が欲しいものの仕組みは簡単だと思いますが、グーグルで見つけたすべての答えは常に何かが欠けています。
.net - 文書化されていないIUnknownを返すCOMサーバーメソッドをどうするか
タイプライブラリ(ハードウェアSDKの一部)からインポートしたCOMインターフェイスのメソッドの一部は、タイプIUnknownの値を返すか受け取ります。例として、SDKドキュメントは次のようにメソッドを指定します。
しかし、Delphiはこれらのメソッドを次のようにインポートしました。
InputSelection型は単純な整数型または列挙型のようですが、どこにも指定されていません。ドキュメントには、14の異なる可能な値とその意味の表のみが記載されています。
理想的には、自分のタイプを宣言したいと思います。
タイプライブラリがこれらの関数を定義する方法は次のとおりです。
しかし、どうすればこれを機能させることができますか?
c++ - DirectX - D3DXCreateTextureFromFile() への各呼び出しの新しいデバイス リファレンス?
私はdirectX APIを使ってプログラムを書いています。DXUTを使い始めました。directX デバイスの参照カウントを制御しようとすると問題が発生します。D3DXCreateMesh()、D3DXCreateTextureFromFile()、または IDirect3DDevice9::CreateVertexBuffer() を呼び出すたびに、参照がデバイスに追加されるようです。「SYSTEMMEM」フラグを使用して、新しく作成されたオブジェクト (メッシュ、テクスチャ、または頂点バッファー) をデバイスの割り当て内に格納するのではなく、システムのメモリに格納しようとしました。デバイスへの参照を追加した呼び出しの例を次に示します...
この問題に関するアイデアや情報へのリンクはありますか? これは予想されることですか?これまでの解決策は、上記の関数を呼び出すたびに直接デバイスを解放することでした (m_pd3dDevice->Release())。DXUT がデバイスを解放しようとすると、デバイスの参照カウントが 0 より大きいことを示すエラーがスローされます。
c++ - DirectX インターフェイスを IUnknown ポインターにキャストする
私のコードにはかなりの数のインターフェイスがあり、繰り返しコードをマクロではなく別のメソッドにカプセル化したかったRelease
のです。これは C++ であり、マクロの使用が嫌いだからです。私の最初の試みは、次のようなメソッドを書くことでした
ただし、このメソッドをIDirect3DSurface9 *
eg のようなものに適用すると、と互換性がないSafeRelease(&mySurface)
というエラーが発生します。IDirect3DSurface9 **
IUnknown **
- 私はここで何を間違っていますか?
- そのような関数を実装するためのより良いアプローチ (できればマクロを使用しない) はありますか?