問題タブ [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.

0 投票する
2 に答える
501 参照

delphi - Delphi 6 クラス宣言でインターフェイス ポインタを割り当てますか?

何年にもわたる Delphi プログラミングにもかかわらず、IUnknown をサポートするクラスで見たことのないクラス宣言スタイルに出くわしました。

ご覧のとおり、IUnknown インターフェイス メソッドへのクラス メソッドの割り当ては、クラス宣言で直接行われています。コンストラクターが呼び出される前に、IUnknown メソッドがどのように割り当てられるかがわからないため、これは特に奇妙に見えます。これは、クラスのメソッドと、後で実行時に解決される、クラスが受け入れるインターフェイスのインターフェイス ポインターとの間の割り当てを行うためのコンパイル時のショートカットのようなものですか? これがどのように機能するか、およびこの種の構造をサポートする Delphi イディオムについて誰かが少し情報を提供できれば、私は知りたいです。

0 投票する
1 に答える
624 参照

.net - .NETでのIUnknown派生ATLCOMオブジェクトの使用

私のIDL:

私のCOMクラス:

私の.NETクライアント:

クライアントは例外「System.AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました...」を受け取ります。なんで?

Visual Studio 2008、WindowsVistax64を使用しています。C ++およびC#プロジェクトにはx86構成があります。

0 投票する
1 に答える
1161 参照

.net - IUnknown としての 'object[]' のマネージドからアンマネージドへのマーシャリング

P/Invoke を使用して C# からアンマネージ C 関数を呼び出し、オブジェクトの配列を渡しています。アンマネージ コードでは、IDispatch に対して IUnknown をクエリします。これは単純なケースでは機能しますが、オブジェクトの 1 つが配列自体である場合、IDispatch の取得は失敗します。

マネージド コード:

アンマネージ コード:

ほとんどの場合、QueryInterface は成功します。しかし、マネージド オブジェクトが実際に「System.Object[]」である場合、IDispatch インターフェイスを取得できません (hr = 0x80004002 = E_NOINTERFACE = 「そのようなインターフェイスはサポートされていません」)。

これを修正する何らかの方法で MarshalAs(...) を使用できますか? または、これを機能させる別の方法はありますか?

0 投票する
0 に答える
383 参照

silverlight - Silverlight の Marshal.GetObjectForIUnknown 代替

WPFでは、次を使用できます。

私の INuiFrameTexture は次のようになります。

今、Silverlight で同じことを達成しようとしていますが、フレームワークには GetObjectForIUnknown メソッドがありません。Silverlight でこれを行う方法があるかどうかは誰にもわかりませんか?

0 投票する
2 に答える
958 参照

c# - .NET Bitmap オブジェクトを COM に渡す (DirectShow フィルタ)

一連の画像に基づいてライブ ビデオ ストリームを作成するソース フィルターを作成しようとしています。これを行うために、IUnknown のインターフェイスを作成します。

そして私のプログラムで私はそれを手に入れます:

単純な型を渡すと、すべて正常に動作します。しかし、C# Bitmap オブジェクトを渡そうとすると、エラーが発生しますunable to cast Com object to <my object type>。または、APPCRUSH エラーでアプリケーションがシャットダウンします。

正しい方法ではないことは理解していますが、パラメーターを渡す他の方法はわかりません。IntPtr を BitmapData に渡そうとしたところ、同じアプリケーション クラッシュが発生しました。では、ビットマップを DirectShow フィルターに渡すにはどうすればよいでしょうか。

結果: コード引用の全体像については、インターフェースを作成します。

実装:

アプリケーションで:

0 投票する
2 に答える
4127 参照

c++ - UNKNOWN CLASS のメンバ関数への C++ ポインタ

免責事項私は使用しないか、他BOOSTのライブラリ

最後に、PointerToMemberFunctionの仕組みを学びました。これは私のコード例です

さて、何が問題なのか。Bar::bar実際のプロジェクトでは、どのクラスfooFnPtrが へのポインターであるかがわからないため、何らかの方法で変更する必要があります。つまりBar::bar、 だけでなく、どのクラスでも動作する必要がありFooます。私にはわかりませんが、渡されるクラスのインスタンスへのポインタBar::barです。

役立つことの 1 つは、動作するすべてのクラスがBar::bar1 つのクラスの子であることです。

これは達成可能ですか?コードを修正するにはどうすればよいですか? 前もって感謝します!

0 投票する
2 に答える
2388 参照

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のクレイジーなものをすべてスキップして、コレクション数を取得するメソッドや、特定のインデックスのプロパティの値を取得する他のメソッドを作成できます。

しかし、それは良くないようです。私が欲しいものの仕組みは簡単だと思いますが、グーグルで見つけたすべての答えは常に何かが欠けています。

0 投票する
1 に答える
317 参照

.net - 文書化されていないIUnknownを返すCOMサーバーメソッドをどうするか

タイプライブラリ(ハードウェアSDKの一部)からインポートしたCOMインターフェイスのメソッドの一部は、タイプIUnknownの値を返すか受け取ります。例として、SDKドキュメントは次のようにメソッドを指定します。

しかし、Delphiはこれらのメソッドを次のようにインポートしました。

InputSelection型は単純な整数型または列挙型のようですが、どこにも指定されていません。ドキュメントには、14の異なる可能な値とその意味の表のみが記載されています。

理想的には、自分のタイプを宣言したいと思います。

タイプライブラリがこれらの関数を定義する方法は次のとおりです。

しかし、どうすればこれを機能させることができますか?

0 投票する
1 に答える
348 参照

c++ - DirectX - D3DXCreateTextureFromFile() への各呼び出しの新しいデバイス リファレンス?

私はdirectX APIを使ってプログラムを書いています。DXUTを使い始めました。directX デバイスの参照カウントを制御しようとすると問題が発生します。D3DXCreateMesh()、D3DXCreateTextureFromFile()、または IDirect3DDevice9::CreateVertexBuffer() を呼び出すたびに、参照がデバイスに追加されるようです。「SYSTEMMEM」フラグを使用して、新しく作成されたオブジェクト (メッシュ、テクスチャ、または頂点バッファー) をデバイスの割り当て内に格納するのではなく、システムのメモリに格納しようとしました。デバイスへの参照を追加した呼び出しの例を次に示します...

この問題に関するアイデアや情報へのリンクはありますか? これは予想されることですか?これまでの解決策は、上記の関数を呼び出すたびに直接デバイスを解放することでした (m_pd3dDevice->Release())。DXUT がデバイスを解放しようとすると、デバイスの参照カウントが 0 より大きいことを示すエラーがスローされます。

0 投票する
3 に答える
795 参照

c++ - DirectX インターフェイスを IUnknown ポインターにキャストする

私のコードにはかなりの数のインターフェイスがあり、繰り返しコードをマクロではなく別のメソッドにカプセル化したかったReleaseのです。これは C++ であり、マクロの使用が嫌いだからです。私の最初の試みは、次のようなメソッドを書くことでした

ただし、このメソッドをIDirect3DSurface9 *eg のようなものに適用すると、と互換性がないSafeRelease(&mySurface)というエラーが発生します。IDirect3DSurface9 **IUnknown **

  1. 私はここで何を間違っていますか?
  2. そのような関数を実装するためのより良いアプローチ (できればマクロを使用しない) はありますか?