在一个dll中定义了以下函数:
DLL_API void dump_log_file(FILE *fout, char *format_string, ...)
{
va_list args;
EnterCriticalSection(&cs);
va_start(args, format_string);
vfprintf(fout, format_string, args);
va_end(args);
LeaveCriticalSection(&cs);
}
在应用程序中调用dump_log_file。但执行vfprintf时总是报非法访问内存错误。
从Stack Overflow查到以下答案(https://stackoverflow.com/questions/12307161/c-writing-to-file-from-dll-with-file-opened-in-application):
This is likely being caused by your application and your DLL disagreeing on which version of the C runtime they're using. Unless they're both compiled against the exact same version of the C runtime, all bets are off, and you can't call CRT functions from one using the data from another or vice-versa.
The safest way to avoid this problem is not to pass FILE*
pointers across DLL boundaries. That way, any interaction with a FILE*
will always happen using the same version of the CRT, and there's no danger of any mismatches. So your DLL should not expose a FILE*
variable; instead it should be some opaque type, and all operations on the variable need to happen in the same module.