調(diào)試OCX控件的DllRegisterServer函數(shù)

字號:

今天遇到一個問題。
    一個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資源后,再編譯,注冊成功了。