Ну, у меня возникли проблемы с ошибкой, которую я не понимаю.
Это два связанных файла:
Внутри DLLExporter :
#ifdef LOGGER_EXPORTS
#define LOGGER_API __declspec(dllexport) __stdcall
#else
#define LOGGER_API __declspec(dllimport) __stdcall
#endif
typedef long (CALLBACK *LPFNTIMER)( void );
// Exported Functions
bool LOGGER_API Initialize( std::string filename, bool ShowConsole = true );
bool LOGGER_API Release( void );
bool LOGGER_API SetTimer( LPFNTIMER );
bool LOGGER_API Initialize(std::string filename, bool ShowConsole)
{
[...]
}
bool LOGGER_API Release()
{
[...]
}
bool LOGGER_API SetTimer(LPFNTIMER fn)
{
[...]
}
внутри DLLExporter.def
LIBRARY DLLExporter.dll
EXPORTS
Initialize
Release
SetTimer
внутри DLLImporter :
typedef long (__stdcall *LPFNTIMER)( void );
typedef bool (__stdcall *LPFNINITIALIZER)( string, bool );
typedef bool (__stdcall *LPFNTIMERSETUP)( LPFNTIMER );
typedef bool (__stdcall *LPFNRELEASER)( void );
[...]
long __stdcall TimerFunc()
{
return 0;
}
[...]
if (g_DLLExporter == NULL)
return false;
LogInit = (LPFNINITIALIZER)GetProcAddress(g_DLLExporter, "Initialize");
LogRelease = (LPFNRELEASER)GetProcAddress(g_DLLExporter, "Release");
LogTimer = (LPFNTIMERSETUP)GetProcAddress(g_DLLExporter, "SetTimer");
if ( LogInit == NULL || LogRelease == NULL || LogTimer == NULL)
return false;
if (!LogInit("test.log", true))
return false;
if (!LogRelease())
return false;
if (!LogTimer(TimerFunc))
return false;
Этот код полностью проходит до сбоя вызова LogTimer с сообщением Run-Time Check Failure # 0.
Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено при вызове функции.Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах, с указателем функции, объявленным с другим соглашением о вызовах.
Я уже отмечал проблемы __stdcall, о которых сообщалось в другом месте, но, как вы можете видеть вышея включил это, и я даже принудил __stdcall соглашение о вызовах в свойствах проекта (MSVS 2010).Любые мысли о том, почему я получаю ошибку только в функции таймера, а не в функциях init или release?