本来,RELEASE版本的Dll搭配Release版本的Exe,Debug版本的Dll搭配Debug版本的Exe是最正常的情形。
不过我测试的结果却正好相反,最正常的情形下Exe关闭时会出错,其它的情形则可以正常关闭EXE。
不过我测试的结果却正好相反,最正常的情形下Exe关闭时会出错,其它的情形则可以正常关闭EXE。
★UseOfMFC:共享★
【DLL】 | 【EXE】 | 【EXE終了OK?】 |
RELEASE版 | RELEASE版() | NG |
DEBUG版 | DEBUG版 | NG |
RELEASE版() | DEBUG版 | OK |
DEBUG版 | RELEASE版() | OK |
★UseOfMFC:动态链接★
【DLL】 | 【EXE】 | 【EXE終了OK?】 |
RELEASE版 | RELEASE版() | OK |
DEBUG版 | DEBUG版 | OK |
RELEASE版() | DEBUG版 | OK |
DEBUG版 | RELEASE版() | OK |
在没有找到原因的很长一段时间里,我不得不把EXE的项目配置属性“MFC的使用”(UseOfMFC)改成
“在静态库中使用MFC”,虽然文件大小会变大,不过能正常使用倒也不错。
“在静态库中使用MFC”,虽然文件大小会变大,不过能正常使用倒也不错。
直到最近,因为调查别的问题而发现了Dll中的ExitInstance函数并没有正常被执行而是中途就莫明地退出了。
详细参见:【 new与delete必须成对使用吗?】 http://blog.csdn.net/mxclxp/article/details/7524116
详细参见:【 new与delete必须成对使用吗?】 http://blog.csdn.net/mxclxp/article/details/7524116
解决了这个问题后,本文里这个问题也消失了。
原来啊,因为Dll的ExitInstance没有被正常执行,故EXE的ExitInstance中调用afxContextIsDLL宏时出现了Access Violation。
那为什么别的搭配下不会出问题呢?静态链接下因为使用的mfc动态链接库是完全不同的拷贝,故Dll中出现的没有正常
终止ExitInstance的问题不会影响至EXE程序的ExitInstance。共享DLL下,因为mfc90.dll与mfc90d.dll是两个版本,
故交叉搭配使用时也不会引起交叉影响。故此问题只会在最正常使用的情形下出现问题。
终止ExitInstance的问题不会影响至EXE程序的ExitInstance。共享DLL下,因为mfc90.dll与mfc90d.dll是两个版本,
故交叉搭配使用时也不会引起交叉影响。故此问题只会在最正常使用的情形下出现问题。