ocx控件:调试OCX控件的DllRegisterServer函数

今天遇到一个问题。



一个OCX程序,编译完成后注册的时候弹出一个断言错误。

注册控件失败了。



经过分析,可能是OCX的注册函数出了问题。

VC6生成的控件程序中DllRegisterServer都一样。如下所示。

STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);



if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);

}



怎样调试到这个函数里面,是个问题。

普通的方法肯定行不通。



经过几次尝试后,终于调试成功。

对OCX工程做一些设置,如图所示。









解释一下,OCX自己不能执行,必须有调用的exe,

所以在Executable for debug session中输入C:\Windows\system32\regsvr32.exe作为启动程序。

Program arguments中输入本OCX为参数。



这样,执行后,会启动

C:\Windows\system32\regsvr32.exe Debug\TestActiveX1.ocx。



在执行前,在

STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);



if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);

}

的AFX_MANAGE_STATE(_afxModuleAddrThis); 处加入断点。



在VC6中启动调试,刷的一下,就执行到了断点处。



单步跟踪了一下,很快问题点找到了。



原来是一个String资源没有添加,导致MFC的断言错误了。



加上相应的String资源后,再编译,注册成功了。

Tags:  如何注册ocx控件 vbocx控件 注册ocx控件 ocx控件

延伸阅读

最新评论

发表评论