2013-05-21 57 views
1

我想使用一個COM功能:CreateInstance http://msdn.microsoft.com/en-us/library/k2cy7zfz%28v=vs.80%29.aspx加載一個接口出現故障

這樣

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

但是我沒有的XXXCLSID我只知道它的接口名稱ISubPointer 當我用oleview查看文件時,我可以在tlb文件中看到它的接口描述。我應該怎麼做才能使用那個CreateInstance

+1

這是不可能的。一個接口由一個coclass實現。您必須先創建類對象,然後才能調用QueryInterface()來獲取接口指針。創建對象需要知道CLSID或ProgId。請聯繫此類型庫的供應商或作者以尋求幫助。 –

回答

0

有兩種方法可以做到這一點:

月1日:一個ClassFactory,並且

第二:一個輔助函數來創建一個指針。

我發現this

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的情況下提供組件。

+0

是的,文件也這麼說,但事實是,我找不到所需的CLSID。 [我搜索了一切 - 人們聲稱系統運行良好] –

+0

那麼,你是否在OLEViewer中找到它,或者你沒有? –

0

您有幾個選項可用於獲取要創建的對象的類ID。您可以使用OLE Viewer生成頭文件,或者使用#import指令直接將類型庫導入源文件。您引用的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對象。

+0

謝謝,我從調試中看到CreateInstance的返回值是「Class not registered」 –

+0

如果您知道該類已註冊,請確保使用類ID調用'CreateInstance',而不是使用接口ID(其中原本在我的答案,直到一個快速編輯) –

+0

謝謝,接口是在那裏,因爲我可以在oleview中看到,但它沒有一個coclass,它沒有在類型庫中有它自己的CLSID_XXX –