首页
社区
课程
招聘
[讨论]今天发现VC Runtime中fopen的奇怪现象
发表于: 2014-6-5 19:03 4037

[讨论]今天发现VC Runtime中fopen的奇怪现象

2014-6-5 19:03
4037
今天刚发现的,现象如下:
假设程序有个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我理解有错?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
既然话都这么说了,那就直接用Windows API实现不就可以了?
2014-6-5 19:43
0
雪    币: 3
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
see this http://msdn.microsoft.com/en-us/library/ms235460.aspx
2014-6-5 19:54
0
游客
登录 | 注册 方可回帖
返回
//