首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载接口失败

加载接口失败
EN

Stack Overflow用户
提问于 2013-05-21 07:23:05
回答 3查看 866关注 0票数 1

我想使用一个COM函数:CreateInstance http://msdn.microsoft.com/en-us/library/k2cy7zfz%28v=vs.80%29.aspx

像这样

代码语言:javascript
复制
IPointer p=NULL;
HRESULT hr=p.CreateInstance(xxx);

但是,我没有xxx的CLSID,我只知道它的接口名ISubPointer,当我用oleview查看该文件时,我可以看到它在tlb文件中的接口描述。我该怎么做才能使用那个CreateInstance

EN

回答 3

Stack Overflow用户

发布于 2013-05-21 07:26:21

有两种方法可以做到这一点:

第一名:ClassFactory,以及

第二:创建指针的辅助函数。

我找到了

代码语言:javascript
复制
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

代码语言:javascript
复制
HRESULT CoCreateInstance(
  _In_   REFCLSID rclsid,
  _In_   LPUNKNOWN pUnkOuter,
  _In_   DWORD dwClsContext,
  _In_   REFIID riid,
  _Out_  LPVOID *ppv
);

如果您可以从OLEVIEW收集CLSID,请使用它,否则必须有有关这方面的文档。如果不公开ist CLSID,就无法交付组件。

票数 0
EN

Stack Overflow用户

发布于 2013-05-21 07:36:55

您有几个选项可用于获取要创建的对象的类ID。可以使用OLE查看器生成头文件,也可以使用#import指令将类型库直接导入源文件。您所引用的CreateInstance函数是_com_ptr_t的非静态成员,需要使用它的实例。

下面的示例应该可以帮助您上路。

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2013-05-21 12:01:10

如果不知道类ID,就不能创建COM对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16664343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档