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を作成する方法がわかりません。