Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加载接口失败_C++_Visual C++_Visual Studio 2012_Com - Fatal编程技术网

C++ 加载接口失败

C++ 加载接口失败,c++,visual-c++,visual-studio-2012,com,C++,Visual C++,Visual Studio 2012,Com,我想使用COM函数:CreateInstance 像这样 IPointer p=NULL; HRESULT hr=p.CreateInstance(xxx); 但是我没有xxx的CLSID,我只知道它的接口名ISubPointer 当我使用oleview查看文件时,我可以在tlb文件中看到它的接口描述。要使用该CreateInstance,我应该怎么做?有两种方法: 第一:一个类工厂,和 第二:创建指针的辅助函数 我发现: 另见: 如果可以从OLEVIEW收集CLSID,请使用它,否则必须有

我想使用COM函数:
CreateInstance

像这样

IPointer p=NULL;
HRESULT hr=p.CreateInstance(xxx);
但是我没有xxx的
CLSID
,我只知道它的接口名
ISubPointer

当我使用
oleview
查看文件时,我可以在tlb文件中看到它的接口描述。要使用该
CreateInstance
,我应该怎么做?

有两种方法:

第一:一个
类工厂
,和

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

我发现:

另见:


如果可以从OLEVIEW收集
CLSID
,请使用它,否则必须有相关文档。如果不公开ist
CLSID

就无法交付组件。您有两个选项可用于获取要创建的对象的类ID。可以使用OLE Viewer生成头文件,也可以使用指令将类型库直接导入源文件。您引用的函数是
\u com\u 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;
 }
#包括//com\ptr\t
#导入“tlbname.tlb”//更改类型库的名称
int main()
{
共初始化(空);
::_com_ptr_t ptr;
//CoISubPointer是在类型库中指定的类ID
//您需要相应地更改名称。
ptr.CreateInstance(uuuId(CoISubPointer),NULL,CLSCTX_INPROC_SERVER);
coninitialize();
返回0;
}

main()
完成后,
ptr
将自动释放它对它所持有的
ISubPointer
对象的引用。

如果不知道类ID,就不能创建COM对象。我建议阅读本文中COM的基本内容

谢谢,我从调试中看到CreateInstance的返回值是“类未注册”如果您知道该类已注册,请仔细检查以确保使用类ID而不是接口ID调用
CreateInstance
(在快速编辑之前,该ID最初出现在我的答案中)谢谢,正如我在oleview中看到的那样,接口在那里,但是它没有一个coclass,它在类型库中没有自己的CLSID_XXX。如果您知道类id,您可以始终在本地声明它
const GUID CLSID_ISubPointer={…};
@MilosevicTrigolos-未注册的类可能是x86与x64的问题。请确保您正在访问的COM服务器与客户端具有相同的位。这是不可能的。接口是由一个类实现的。您必须先创建类对象,然后才能调用QueryInterface()获取接口指针。创建对象需要知道CLSID或ProgId。请与此类型库的供应商或作者联系以寻求帮助。是的,文档也这么说,但事实是我找不到所需的CLSID。[我搜索了所有内容-人们声称系统运行良好]你是在OLEViewer中找到的还是没有?
HRESULT CoCreateInstance(
  _In_   REFCLSID rclsid,
  _In_   LPUNKNOWN pUnkOuter,
  _In_   DWORD dwClsContext,
  _In_   REFIID riid,
  _Out_  LPVOID *ppv
);
#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;
 }