相关环境:
Win7 64位
MFC工程 UNICODE字符类型
相关技术点:
为进程指定用到的IE版本
问题引出:
最近做一个类似浏览器的应用,加载网页地址url。我是自己写的一个类,继承自CHtmlView,然后做一些处理。
其中涉及到了必须得指定IE内核的操作。但是遇到个很莫名其妙的问题,当用户电脑的IE内核版本为IE9时,如果指定进程中的CHtmlView使用IE9内核的话,程序就会在调用窗口过程函数时
即文件wincore.cpp中的428行
1--> LRESULT CALLBACK
_AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
中的
2--> if (bCallDefault)
lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam);
处出现崩溃的情况。因此我详细做了一个测试,如下表所示:
表头的7000、8888等代表修改注册表SOFTWARE\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION下的数值,即指定IE版本
数值具体含义请参考:http://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx
Wrong代表CHtmlView在加载网页时,在调用窗口过程函数时(即上面的2-->处)出现崩溃情况
Right代表没有出现崩溃情况
从测试结果可以看出,当IE内核为IE9时,如果我们指定CHtmlView用的IE内核为IE9或IE11版本时,则程序会出现在调用窗口过程函数时崩溃的情况。我不知道这是为什么,是否跟页面上有某些控件有关。但当遇到这种情况时,我们可以避开在IE9上指定IE9或IE11内核
PS:如果用户电脑上的最新版本是IE9,此时即使你指定IE10或IE11,CHtmlView使用的版本也只能是IE9,即当前最高版本。可是为什么我测试结果中,IE内核为IE9时,我指定IE9、IE11都出现崩溃情况,但指定IE10没有任何问题?不知道这是什么原因,感兴趣的可以在这探讨下