描述:
我定义了一个从已有的IXinterface派生的类IMyClass,而且也通过宏
DEFINE_GUID()得到了一个CLSID_MYCLASS,编译通过了。
可是使用这个类的时候,IMyClass *p=NULL ;
p->CoCreateInstanse(CLSID_MYCLASS,.....);
编译却不通过,编译器提示说是无法解析_CLSID_MYCLASS,是不是这个CLSID_MYCLASS我不能随便给?
后来我试了别的方法,不使用DEFINE_GUID,直接调用CLSIDFromProg()来获取CLSID_MYCLASS,可是结果还是不对(一直是GUID_NULL).
我怀疑是不是我的类IMyClass没有做成com,还没有注册,所以得不到他的CLSID?
刚刚学习使用com,请高手们指教!
解决方案1:
要包含定义CLSID的头文件!
解决方案2:You must get the component's CLSID for CoCreateInstance()'s first parameter.
解决方案3: 你可以从VC的tool-->ole/com object viewer 中看看你的com有没有被注册!
如果有注册,找到ProgID="xxxx.xxxx"
#include "../XXXX.h"//这里请注意路径, XXXX是你的COM的头文件
#include "../XXXXi.c"//这里请注意路径
::CoInitialize( NULL );
It1 *MySrv = NULL; //It1 为接口的类名
CLSID csid;
CLSIDFromProgID( OLESTR("xxxx.xxxx""), &csid) //为该接口类的ProgID
if ( FAILED ( ::CoCreateInstance(
csid, NULL,
CLSCTX_INPROC_SERVER,
IID_It1, // IID_It1为在srv1_i.c中定义的接口ID
(void **) &MySrv)
))
return;
int * re = new int;
MySrv->add(2,6,re);//add 是你的接口中定义的方法
CString s1;
s1.Format("result%d",*re);
::AfxMessageBox(s1);
MySrv->Release();
delete re;
::CoUninitialize();
inclue "xx_x.c"
CLSID 组件和客户程序都需要有定义,而且值必须一样。
组件说,我生成了一个用CLSID_MYCLASS标识的组件
客户说,我需要调用一个名叫CLSID_MYCLASS的组件
于是,暗号对接成功。
至于如何保证两个CLSID_MYCLASS值一致呢,可以让组件和客户程序共用一个CLSID_MYCLASS的声明头文件!也可以抄成两份,总之嘛……^_^
呵呵,还要在自己的程序中定义CLSID;
解决方案7: 客户程序是指你调用这个组件的程序.
http://www.vckbase.com/document/viewdoc/?id=916
这篇文章中的做法,
#include "../MathCOM.h"//这里请注意路径
#include "../MathCOM_i.c"//这里请注意路径
就是将在组件中的CLISD定义包含了,
也可以拷贝定义到客户程序.
客户端程序同样需要定义IMyClass的CLISD的
您可能想查找下面的文章:
- INTERFACE接口的clsid是怎么一回事?
- ProgIDFromCLSID相关
- GUID,CLSID,PROGID之间的关系?
- 知道com对象的clsid,不知道它的其它接口的id,如何访问这些接口?
- 如何实现COM中类的嵌套??
- 为什么这个CLSID_WavDestFilter注册成功了,但是不能用
- 我编的ocx依赖于某些非标准dll,打包成cab时需要在inf中写入这些dll的clsid吗?
- CLSID怎么和对应的类联系起来啊?高手帮忙!
- 做activex插件的cab包时,inf文件中的clsid应该是idl文件中的哪一个?或者随便编一个都没关系?
- 我封装的dll如何知道clsid?