dllからエクスポートされたファイルポインタがあります。これは、アプリケーションによって初期化(fopen)され、dll内で使用(fprintf)されます。
問題は、fprintfが例外をスローすることです。
DLLFile.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();
APLICATION.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 [] からの要素を割り当てます。
DLLでは、fprintfが呼び出されると、pFileが_iob []の一部であることがチェックされますが、アプリケーションからの_iob []はDLL内のものと同じではないようです(アドレスが異なります)。
2同じユースケース(同じアプリケーション)ともう1つの似たようなDLLがあり、すべてが正常に機能します(_iob []はアプリケーションとDLLの同じ場所にあります)。