我想使用COM功能:CreateInstance
http://msdn.microsoft.com/en-us/library/k2cy7zfz%28v=vs.80%29.aspx
IPointer p=NULL;
HRESULT hr=p.CreateInstance(xxx);
但是我没有 xxx 的CLSID
我只知道它的接口名称ISubPointer
当我用oleview
查看文件时,我可以在tlb文件中看到它的接口描述。我该怎么做才能使用CreateInstance
?
答案 0 :(得分:0)
有两种方法可以做到这一点:
1st:ClassFactory
和
2nd:创建指针的辅助函数。
我找到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
,则无法投放组件。
答案 1 :(得分:0)
您可以使用几个选项来获取要创建的对象的类ID。您可以使用OLE查看器生成头文件,也可以使用#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
对象的引用。
答案 2 :(得分:0)
如果不知道类ID,则无法创建COM对象。我建议在本文http://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-It
中阅读COM的基础知识