今天遇到一個問題。
一個OCX程序,編譯完成后注冊的時候彈出一個斷言錯誤。
注冊控件失敗了。
經(jīng)過分析,可能是OCX的注冊函數(shù)出了問題。
VC6生成的控件程序中DllRegisterServer都一樣。Examda提示如下所示。
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);
}
怎樣調(diào)試到這個函數(shù)里面,是個問題。
普通的方法肯定行不通。
經(jīng)過幾次嘗試后,終于調(diào)試成功。
對OCX工程做一些設(shè)置,如圖所示。

解釋一下,OCX自己不能執(zhí)行,必須有調(diào)用的exe,
所以在Executable for debug session中輸入C:\Windows\system32\regsvr32.exe作為啟動程序。
Program arguments中輸入本OCX為參數(shù)。
這樣,執(zhí)行后,會啟動
C:\Windows\system32\regsvr32.exe Debug\TestActiveX1.ocx。
在執(zhí)行前,在
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中啟動調(diào)試,刷的一下,就執(zhí)行到了斷點處。
單步跟蹤了一下,很快問題點找到了。
原來是一個String資源沒有添加,導(dǎo)致MFC的斷言錯誤了。
加上相應(yīng)的String資源后,再編譯,注冊成功了。
一個OCX程序,編譯完成后注冊的時候彈出一個斷言錯誤。
注冊控件失敗了。
經(jīng)過分析,可能是OCX的注冊函數(shù)出了問題。
VC6生成的控件程序中DllRegisterServer都一樣。Examda提示如下所示。
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);
}
怎樣調(diào)試到這個函數(shù)里面,是個問題。
普通的方法肯定行不通。
經(jīng)過幾次嘗試后,終于調(diào)試成功。
對OCX工程做一些設(shè)置,如圖所示。

解釋一下,OCX自己不能執(zhí)行,必須有調(diào)用的exe,
所以在Executable for debug session中輸入C:\Windows\system32\regsvr32.exe作為啟動程序。
Program arguments中輸入本OCX為參數(shù)。
這樣,執(zhí)行后,會啟動
C:\Windows\system32\regsvr32.exe Debug\TestActiveX1.ocx。
在執(zhí)行前,在
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中啟動調(diào)試,刷的一下,就執(zhí)行到了斷點處。
單步跟蹤了一下,很快問題點找到了。
原來是一個String資源沒有添加,導(dǎo)致MFC的斷言錯誤了。
加上相應(yīng)的String資源后,再編譯,注冊成功了。

