关于COM组件的注册

Mooker_Lee 2012-11-01 05:15:19
用ATL创建了一个LOCAL COM组件,查了些资料,调用接口函数可以这样做:
包含 *_i.h与*_i.c文件,这个方法就不说了。
假设我现在只有DLL文件,需要完成这些操作,这是这样写的:
1、::LoadTypeLib();
2、::GetTypeInfo();
3、::GetTypeAttr();
这样就得到了CLSID_*与IID_I*,但问题来了,
::CoCreateInstance()出错,错误是没有注册类。但实际上我已经Regsvr32 *.dll N次了,根据CLSID在注册表HKEY_CLASSES_ROOT\CLSID\也可以找得到。又找到 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{647053C3-1879-34D7-AE57-67015C91FC70}\ProgId,发现这个GUID与上个目录下的GUID不一致,然后调用CLSIDFromProgID(),又出错,错误还是那个:没有注册类,不知道何解,希望大神能指点迷津。


// ...

CLSID *pclsid = NULL;
hRlt = ::CLSIDFromProgID(L"System.ArithmeticException", pclsid);

hRlt = ::CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, iid, (void**)&pUnknown);

// ...
...全文
212 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxw_it 2012-11-01
  • 打赏
  • 举报
回复
Regsvr32 重复注册会有问题的。
每次更新组件我都会先把原来的组件regsvr32 /u 一下。

别认为没注册,然后拼命注册。

另外,如果用GUID不行的话,可以用ProgId试试。

还有,组件的注册你要确认是否成功,如果在初始化的时候就有引用其他文件,那在注册的时候组件要跟引用文件放在一起。

如果操作系统是WIN7等权限比较严的系统,注册时要以管理员身份运行。

最后,你程序调用的时候,要把组件放到你的DEBUG(RELEASE)目录下和工程目录下。

hankcs 2012-11-01
  • 打赏
  • 举报
回复
你的dll放在exe的同一个目录下试试
我的组件是一个类的形式,VB开发VC调用
// Machine generated IDispatch wrapper class(es) created with ClassWizard
/////////////////////////////////////////////////////////////////////////////
// _D3DShow wrapper class

class _D3DShow : public COleDispatchDriver
{
public:
_D3DShow() {} // Calls COleDispatchDriver default constructor
_D3DShow(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
_D3DShow(const _D3DShow& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

// Attributes
public:

// Operations
public:
VARIANT AutoShow();
};

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧