转:跨dll操作fopen的返回值导致出错
從老板的blog那里抄來的,一個(gè)很神奇的bug,雷死:
源地址http://www.cnblogs.com/len3d/p/3406294.html
在設(shè)置成/MD 或 /MDd 不會(huì)導(dǎo)致出錯(cuò)
設(shè)置成/MT 或 /MTd 的情況下會(huì)導(dǎo)致出錯(cuò)
看了CRT的實(shí)現(xiàn),估計(jì)是因?yàn)閒open創(chuàng)建了CriticalSection來保護(hù)文件,但是在/MT的情況下,一個(gè)DLL里面的CriticalSection是不能被另外一個(gè)DLL使用的。
?
只是猜測啊。。。。。。。。。。。。。。。
?
看了VS2008 里的crt 源碼,發(fā)現(xiàn)_iob這個(gè)全局變量,
而每個(gè)操作FILE指針的函數(shù)都要,操作這個(gè)變量處理多線程的功能
而MD模式 把crt庫編譯到同一個(gè)靜態(tài)庫里面,所以不會(huì)出現(xiàn)bug
而MTd模式 把crt庫編譯到相應(yīng)的dll文件,導(dǎo)致在調(diào)用操作FILE指針的函數(shù)在 比對(duì)?_iob時(shí)使用的是不同的堆棧數(shù)據(jù),導(dǎo)致bug產(chǎn)生
解決方案:不要跨dll使用fopen 全部工程使用MD 模式
轉(zhuǎn)載于:https://www.cnblogs.com/warpengine/p/3456490.html
總結(jié)
以上是生活随笔為你收集整理的转:跨dll操作fopen的返回值导致出错的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html生物代码,方舟生存进化全生物代码
- 下一篇: 软件需求说明书模板和实际案例