VS2015 在 MFC中插入ActiveX 控件(mstscax.dll)后报出Debug Assertion Failed

昨天同学想基于mstscax.dll 实现一个简单的MSRDP 客户端,参照网上的方法在MFC 对话框插入一个ActiveX 控件

微信图片_20191221145057.png

然后创建对象,但是即使一行代码也不写直接运行,立即就报错了


Debug Assertion Failed!


Program: C:\WINDOWS\SYSTEM32\mfc140ud.dll

File: d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\occcont.cpp

Line: 925


For information on how your program can cause an assertion

failure, see the Visual C++ documentatio


如下图:


微信图片_20191221120636.png

这个问题很奇怪,反推过程应该不是自己的程序造成的,毕竟他直的一行代码也没有写,只是在对话框中加入了一个 ActiveX 控件 "Microsoft RDP Client Control - version 10" , 我帮他测试了一番,无论那个版本 从 version 8 -- 12 都一样,不创建对象也会报同样的错;

根据错误信息分析原因,这个错误是因为 OLE 对象没有初始化;MFC 添加 ActiveX 控件时会从注册表中找到这个控件(需注册过)的SLD , 这段信息也被自动写入到 MFC 的 .rc 资源文件中,我们去 .rc 文件中查看一下应清楚了

微信图片_20191221150534.png

以代码方式查看资源文件

IDD_MFCAPPLICATION5_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "MFCApplication5"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,209,179,50,14
    PUSHBUTTON      "取消",IDCANCEL,263,179,50,14
    CONTROL         "",IDC_MSTSCAX1,"{A0C63C30-F08D-4AB4-907C-34905D770C7D}",WS_TABSTOP,7,7,306,168
END

注意这一行  

CONTROL         "",IDC_MSTSCAX1,"{A0C63C30-F08D-4AB4-907C-34905D770C7D}",WS_TABSTOP,7,7,306,168


{A0C63C30-F08D-4AB4-907C-34905D770C7D} 这个CLSID  我们在注册表中查询一下,马上就有结果了...

这可能是 MFC 的一个BUG , 在 .rc 中自动生成这行时,写入的CLSID  是 11 的,但是 11 目前并不被支持,

微信图片_20191221153309.png


我们把  【计算机\HKEY_CLASSES_ROOT\MsTscAx.MsTscAx.10\CLSID】

中的ID : {8B918B82-7985-4C24-89DF-C33AD2BBFBCD} 记录下来;

将这个ID 写到 .rc 中

CONTROL         "",IDC_MSTSCAX1,"{A0C63C30-F08D-4AB4-907C-34905D770C7D}",WS_TABSTOP,7,7,306,168

改成

CONTROL         "",IDC_MSTSCAX1,"{8B918B82-7985-4C24-89DF-C33AD2BBFBCD}",WS_TABSTOP,7,7,306,168

保存修改。再运行程序就不会报错了

但是仍有一点问题,就是当你在对话框编辑器上调整过控件后,.rc 会自动重生成,这里的ID 又会自动被改成 11 的,蠢死的MFC没办法,发生的时候你就只好再改一次了,目前我暂时没有找到其他办法。