-
-
[讨论]今天发现VC Runtime中fopen的奇怪现象
-
发表于:
2014-6-5 19:03
4038
-
[讨论]今天发现VC Runtime中fopen的奇怪现象
今天刚发现的,现象如下:
假设程序有个exe配合自己的2个dll一起执行,3个模块都采用Multi-threaded Debug (/MTd)模式编译
1.在exe中调用a.dll中的某个函数,里面用(_wsopen)打开了一个文件
2.在exe中调用b.dll中的某个函数,里面用(fstat)函数来取文件信息
这时候怎么取都会出错,为什么?分析得知fstat函数里,调用了(_osfile(fildes))这个宏来取文件是否打开了
_osfile(fildes),实际原理是:
( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)) )->osfile
__pioinfo指向一个全局数组
结果就是,a和b 2个dll里,各自有一份__pioinfo,用来保存打开的文件信息,文件在a.dll里打开的,在b.dll调用取信息是根本没有的!
结果可以理解,但ms实现这么个东西,感觉问题很低级啊,用惯文件句柄的人,都知道,只要是进程中怎么用都是可以的,结果fopen这种就严重不对了,根本不能跨模块使用
不知道大家有何感想?
or我理解有错?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!