■■■■■求助:OCX注册失败!!!!!DllRegisterServer 失败.错误码:0x80040200.....谢谢~~~
问题是这样的:
我做了一个OCX,共享编译然后注册是可以的;
我缓冲静态编译,然后注册就不成功了.....提示信息就是:DllRegisterServer 失败.0x80040200....
我按照下面这篇文章试试了,也不行.仍然是那个错误....谢谢大家给点指导!!!
关于ActiveX控件不能注册的解决方案
发布日期:2007-11-9 13:32:25 点击次数:17
MFC中, 注册控件实际上是调用函数: DllRegisterServer(void),注册失败是因为下面这句函数调用失败:
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
AfxOleRegisterTypeLib函数原型:
BOOL AfxOleRegisterTypeLib( HINSTANCE hInstance, REFGUID tlid, LPCTSTR pszFileName = NULL, LPCTSTR pszHelpDir = NULL );
第三个参数pszFileName指的是类型库(.TLB)文件的名称
当我们用向导生成MFC Activex工程时,IDE默认为工程名.TLB,所以编译后注册正常。但有时由于n多原因,AfxOleRegisterTypeLib 调用时并找不到TLB文件,于是就产生了诸如:
“SZXPlayer.OCX中的DllRegisterServer失败,返回代码是: 0x80040200”这样的错误提示。
这里有两个方案可以解决此问题
一.由于TLB是接口类库,我们只需要调用AfxOleRegisterTypeLib时显示指明类型库文件名即可,例:
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid, "SZXPlayer.tlb"))
//if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
同时将.LIB文件复制到.OCX文件相同路径下。OK, 一切都正常了。
二.第一种方法显然不是最好的解决办法,这样的话控件都得带一个拖累(.TLB)了。根据通常的做法,我们可以把.TLB文件整个先写入到OCX文件中去。打开.RC文件,翻到最后,可以看到形如这样的内容:
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
我们在其中加上TLB类库的信息就OK了,如下所示:
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
1 TYPELIB "SZXPlayer.tlb"
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
最后保存.RC文件, 再打开工程编译。