C++ 加载接口失败
我想使用COM函数: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,请使用它,否则必须有
CreateInstance
像这样
IPointer p=NULL;
HRESULT hr=p.CreateInstance(xxx);
但是我没有xxx的CLSID
,我只知道它的接口名ISubPointer
当我使用
oleview
查看文件时,我可以在tlb文件中看到它的接口描述。要使用该CreateInstance
,我应该怎么做?有两种方法:
第一:一个类工厂
,和
第二:创建指针的辅助函数
我发现:
另见:
如果可以从OLEVIEW收集
CLSID
,请使用它,否则必须有相关文档。如果不公开istCLSID
就无法交付组件。您有两个选项可用于获取要创建的对象的类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;
}