我有一个从 dll 导出的文件指针,它由应用程序初始化(fopen),然后在 dll 中使用(fprintf)。
问题是 fprintf 会抛出异常。
DLL文件.c
#define BUILD_FOO
#include "API.H"
File *pFile;
void exportedFunction()
{
fprintf(pFile,"This will result in an exception\n");//<-This print will crash
}
API.H
#ifdef BUILD_FOO
# define FOOAPI __declspec(dllexport)
#else
# define FOOAPI __declspec(dllimport)
#endif
FOOAPI extern File *pFile;
FOOAPI void exportedFunction();
应用程序.C
#undef BUILD_FOO
#include "API.H"
void main()
{
pFile = fopen("path_to_folder","wt");
fprintf(pFile , "This print will work"); // <- This will be printed ok
exportedFunction();
}
1 从我所做的调试来看,这就是我所看到的:
在应用程序内部, fopen()为pFile分配 一个来自_iob[]的元素。
在调用fprintf的DLL中,检查pFile是否是_iob[]的一部分,但应用程序中的_iob[]似乎与 DLL 中的不一样(它们具有不同的地址)。
2 我有相同的用例(使用相同的应用程序)和另一个有点相似的 DLL,那里一切正常(_iob[] 在应用程序和 DLL 中的相同位置)。