1

IDLで定義されたCOMライブラリを作成しました。これには、IFooという「エントリポイント」があります。

[
    object,
    uuid(789b4d46-4028-4196-8412-4c5c8ef86caa),
    nonextensible,
    pointer_default(unique)
]
interface IFoo: IUnknown
{
    HRESULT HelloWorld();
};

私はこれを次のようにC#ライブラリに実装しました:

[ComVisible(true)]
[Guid("45b50f1e-d551-4be0-b52a-7ec075840114")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IFoo))]
class Foo: IFoo
{
    public void HelloWorld()
    {
        Console.WriteLine("Hello world");
    }
}

これをコンパイルして、次のように登録しました。

regasm.exe foo.dll

これまでのところすべてが良さそうです。

では、C ++プログラムでこのインスタンスを作成するにはどうすればよいですか?正しい関数は::CoCreateInstance:だと思います

::CoInitializeEx(NULL, COINIT_MULTITHREADED); 
IUnknown *pUnk = 0;
HRESULT hr = ::CoCreateInstance(???, 
                                NULL, 
                                CLSCTX_INPROC_SERVER, 
                                __uuidof(IFoo), 
                               (void**)&pUnk);

これは、このクラスのインスタンスを作成する正しい方法ですか?もしそうなら、「???」に何が入りますか その上?

クラスのUUID(上記の「45b50f1e -d551-4be0-b52a-7ec075840114」)はそこにあるはずですが、このGUID文字列から手動でIIDを作成する方法がわかりません。

4

2 に答える 2

2

結局のところ、私は正しかったのですが、クラスのUUIDはそこにありますが、それを取得することは私が予期していなかったことでした。

struct __declspec(uuid("45b50f1e-d551-4be0-b52a-7ec075840114")) Cls;

それで:

HRESULT hr = ::CoCreateInstance(__uuidof(Cls), 
                                NULL, 
                                CLSCTX_INPROC_SERVER, 
                                __uuidof(IFoo), 
                               (void**)&pUnk);

これで問題が修正され、正しく機能しました。

于 2012-05-02T02:13:34.510 に答える
1

MIDLIDLファイルをC++ファイルのセットにコンパイルし、それらをC++プログラムに含めるために使用するだけです。インターフェイスは「エントリポイント」ではなく、IDLにもクラスオブジェクトが必要になることに注意してください。

C ++でCOMクライアントを作成するもう1つの方法は、Microsoft固有の#importディレクティブですが、.NETベースのコンポーネントと互換性があるかどうかはわかりません。.NETコンポーネントの.tlbファイルを作成できる場合は、次のような必要なものを追加するだけです。

#import "MyLibrary.tlb"

このディレクティブには多くのオプションがあります。詳細については、このMSDNの記事を確認してください。

于 2012-05-02T02:12:46.613 に答える