2013-05-21 58 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 –