将FILE*传入DLL出错;奖句柄传入就不出错;(DLL原理分析)

创建一个DLL,随便叫什么,导出个函数,比如:

 

__declspec(dllexport) JudgeFile(FILE *pFile);函数里边随便对pFile执行一些操作,比如:

 

__declspec(dllexport) int JudgeFile (FILE *pFile)
{
 char data[10];
 fread(data, 10, 10, pFile);
 return 0;


}

调用也很简单:

 

FILE *pf = fopen("123.txt", "r");
if (pf==NULL)
 return -1;
JudgeFile (pf);


fclose(pf);这样就行了,马上编译运行一下看看,出错了!“内存不能WRITTER”

分析:

DLL有自己独立的代码段和数据段,它使用的库甚至可以跟exe的不一样而不会引起编译时的冲突,如果FILE*是由DLL打开并使用的,那一点问题都没有,那由exe打开就有问题了?是的,因为C库中的fopen其实最后都是对Win API中的CreateFile的调用,但除了这个调用之外,C库还在一个全局数据结构中记录了文件打开的情况及一些相关信息,所以用fopen打开一个文件,光是它返回的FILE*指针还不足以反映文件的全部状况,所有使用到FILE*指针的C库函数,都需要访问那个全局数据结构,问题来了,DLL拥有自己独立的代码段和数据段,那个全局数据结构,DLL访问的是自己的,而不是exe的,这样就出现了偏差,如果全局结构中根本没有要访问的文件的相关信息,硬是就要用这些不匹配的信息尝试操作文件,当然会导致内存出错啦。

那为什么传递一个文件句柄就没有问题?因为CreateFile打开文件返回的是一个内核对象句柄,这个句柄对整个进程来说,理解都是一致的,不存在额外的全局数据结构问题

你可能感兴趣的:(将FILE*传入DLL出错;奖句柄传入就不出错;(DLL原理分析))