1

COM 関数を使用したい : CreateInstance http://msdn.microsoft.com/en-us/library/k2cy7zfz%28v=vs.80%29.aspx

このような

IPointer p=NULL;
HRESULT hr=p.CreateInstance(xxx);

しかし、私は xxx を持っていませんCLSIDそのインターフェース名しか知りませISubPointeroleview。それを使用するにはどうすればよいCreateInstanceですか?

4

3 に答える 3

0

これを行うには、次の 2 つの方法があります。

1位:a ClassFactory、そして

2 番目: ポインターを作成するヘルパー関数。

私はこれを見つけまし

int main()
{
    IMath* pIMath;
    HRESULT hr;

    // 1. Initialize COM Library
    CoInitialize(NULL);

    // 2. Call CoCreateInstance to get the IMath interface pointer
    hr = CoCreateInstance ( __uuidof(CMathComp), NULL, CLSCTX_INPROC_SERVER,
                            __uuidof(IMath), (void**) &pIMath );

    if ( FAILED(hr) )
    {
        return 0;
    }

    // 3. Call the interface functions
    int sum = pIMath->Add(1, 3);
    printf("Sum = %d \n", sum);

    int sub = pIMath->Sub(4, 3);
    printf("Sub = %d \n", sub);

    // 4. Release the interface pointer if you are done
    pIMath->Release();

    // 5. Un-Initialize COM Library
    CoUninitialize();

    return 0;
}

MSDNも参照してください。

HRESULT CoCreateInstance(
  _In_   REFCLSID rclsid,
  _In_   LPUNKNOWN pUnkOuter,
  _In_   DWORD dwClsContext,
  _In_   REFIID riid,
  _Out_  LPVOID *ppv
);

OLEVIEW から収集できる場合はCLSIDそれを使用します。それ以外の場合は、これに関するドキュメントが必要です。ist を公開せずにコンポーネントを配信することはできませんCLSID

于 2013-05-21T07:26:21.093 に答える
0

作成するオブジェクトのクラス ID を取得するには、いくつかのオプションがあります。#importOLE Viewer を使用してヘッダー ファイルを生成するか、ディレクティブを使用してタイプ ライブラリをソース ファイルに直接インポートできます。参照するCreateInstance関数は非静的メンバーで_com_ptr_tあり、そのインスタンスを使用する必要があります。

次の例は、あなたのやり方を理解するはずです。

#include <comip.h>  // _com_ptr_t
#import "tlbname.tlb" // Change to the name of your type library


int main()
{
    CoInitialize(NULL);

    ::_com_ptr_t<ISubPointer>   ptr;

    // CoISubPointer is the class ID specified in the type library
    // you will need to change the name accordingly.
    ptr.CreateInstance(__uuid(CoISubPointer), NULL, CLSCTX_INPROC_SERVER);

    CoUninitialize();

    return 0;
 }

main()終了すると、保持しているオブジェクトptrへの参照が自動的に解放されます。ISubPointer

于 2013-05-21T07:36:55.943 に答える