7

COM コンポーネントを登録しました。それを呼び出したいと思います。

CLSID clsid;
RIID iid;
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
LPVOID *pRet;
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, pRet);

clsid は正常に取得できますが、iid はどこで取得できますか?

私はOLE VIEWER検索インターフェイスを使用しました:

 [
 odl,
 uuid(F3F54BC2-D6D1-4A85-B943-16287ECEA64C),
 helpstring("Isesoft Interface"),
 dual,
 oleautomation
 ]
 interface Isesoft : IDispatch {

次に、コードを変更しました。

CLSID clsid;
RIID iid;
IDispatch* pDispatch;
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,  IID_IDispatch,(void **)&pDispatch);

しかし、返された hr1 は失敗しました。

4

3 に答える 3

7

COM クラスはいくつかのインターフェイスを実装し、各インターフェイスにはIID識別子があります。したがって、COM コンポーネントの実装から取得する必要があります。それはあなたのコードであり、要求しているインターフェースを正確に指定する識別子を提供することが期待されています。

一部の COM クラスは、よく知られているインターフェイスを実装しています。、またはIDispatchである識別子。IID_IDispatch__uuidof(IDispatch)

アップデート。対象のインターフェースが であることがわかったのでIsesoft、コードは次のようになります。

CLSID clsid;
RIID iid;
IDispatch* pDispatch;
HRESULT nResult1 = CLSIDFromProgID(OLESTR("se.mysoft"), &clsid);
HRESULT nResult2 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
  IID_Isesoft, (void **) &pDispatch);

C++ コードで使用できるIsesoftとを取得するには、定義をインポートする必要があります。通常、次の 2 つのいずれかです。IID_Isesoft__uuidof(Isesoft)

  • 追加のベンダー SDK には、たとえば#include "isesoft\sdk.h"
  • または#import "libid:..."タイプ ライブラリ識別子を使用 (名前空間およびその他の属性が適用されます)

失敗を示すコードがある場合はHRESULT、必ず値を投稿してください。

于 2013-09-03T11:00:02.200 に答える
1

オブジェクトに必要なインターフェイスを知っている必要がありますIMyInterface

IMyInterface* pItf = NULL;
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pItf);
于 2013-09-03T11:10:48.353 に答える