我最近完成了从Visual C ++ 6到VS 2010的非常大的MFC / C ++应用程序的初始端口。该项目包括大约25个自定义DLL模块。解决了大多数编译问题后,当调用其中一个相关的DLL方法时,我会在其中一个DLL模块中反复遇到运行时异常。在调试器中运行没有任何帮助,因为我刚刚在异常之后得到了废话:在破坏性调用之前可以访问的损坏的CStrings等。 VS 2008中的效果相同。调试器和调用堆栈刚丢失。 (这应该是一个线索)
经过几个星期的抓挠和进一步调试后,我终于对多个DLL的源代码进行了更多的检查,发现大约20个头文件打开/关闭字节对齐如下:
#pragma pack(push,1)
...
Some byte aligned structures
...
#pragma pack(pop,1)
再次阅读MSDN文档后,我意识到他们犯了一个错误,并且他们应该让第二个pragma成为#pragma pack(pop)
以恢复到之前的打包对齐。事实上,他们正在进行字节对齐打包。
当调用一些DLL函数时,DLL中的这个字节错位导致地狱崩溃。当这神奇地解决了这个问题时,你无法想象这种解脱。
现在回答我的问题:
为什么这不会损坏旧VC ++ 6版本中的链接?我可以 只假设旧的编译器有一个“功能”来防止这种情况发生 是二元,静态或动态的问题。
有没有办法通过编译器开关或其他方法检测到这一点。这是一个非常讨厌的bug,我也浪费了 很多时候找到它!
感谢您提供的任何建议。