2016-03-29 10 views
3

IMMDeviceEnumeratorのインターフェイスを作成したいとします。COMオブジェクトの理解と宣言方法

私はオンラインの定義を示す例を参照してください。

[ComImport] 
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IMMDeviceEnumerator 
{ 

} 

私は(多分)理解してどのような:[ComImport]属性は、それがDLLからだことを指定します。 [Guid]属性はインターフェイス識別子です。

私が理解できないもの:このGUID値はどのように取得されましたか? [InterfaceType]属性は何をしますか?その他の機能はどのように記入しますか?

私はこのことを理解しようとして失われています、すべてのドキュメントは超不透明です。

答えて

1

このGUID値はどのように取得されましたか?

GUIDは、COMインターフェイス定義の一部として作成されます。他の人のオブジェクトを呼び出そうとしているので、GUIDを使用する必要があります。 mmdeviceapi.hMMDevice docsを参照してください。

ヘッダーファイルMmdeviceapi.hは、MMDevice APIのインターフェイスを定義します。

MIDL_INTERFACE("A95664D2-9614-4F35-A746-DE8DB63617E6") 
    IMMDeviceEnumerator : public IUnknown 

これを行うための通常の方法は、COM DLLへの参照を追加したり、全ての魔法グーであなたのためのCOMクラスラッパーを生成しますどのTlbimp.exeを実行することです。

COMタイプのライブラリが利用できない場合は、基本的にIDLファイルを参照してください。

p/invokeシグネチャと同様に、これはかなり痛いかもしれません - だからbest to use an existing one if you can

COM相互運用機能のより大きな問題については、基本的にCOMを少し学習し、C#に精通している必要があります。general docsout thereですが、よく知られているCOMコンポーネントを使用しようとしているのであれば、できるだけ​​を使用することをお勧めします。

+0

これは正しいです。私が意図したことは、自分で作成する場合は、独自のGuidを作成することでした。 –

+0

これは、多くの助けになります。その図書館に私を案内してくれてありがとう! – flakes

0

自分でGUIDを作成します。あなた自身を割り当てたくなければ、オンラインの発電機があります。

すべてのインターフェイスタイプは、IUnknownから派生する必要があります。

更新:ここは発電機です。 https://www.guidgenerator.com/online-guid-generator.aspx

IMMDeviceEnumeratorは既に特定のGUIDで定義されているため、同じものが使用されます。独自のインターフェイスを作成する場合は、独自のGUIDを作成します。

その制約の中で、カスタムインタフェースは非同期メソッドを含む、ほぼすべての方法やパラメータを、サポートすることができます」

ので、あなたは、 IUnknownをオフに引き出す。クライアントが情報にアクセスできるようにします。また、カスタム・インタフェースのタイプライブラリを生成することができます実行時にオブジェクトのメソッドについて調べてください」

+1

既存のインターフェイスのinteropコードを探していると思われるOPには役立たないでしょう。 –

関連する問題