好吧,我遇到了一些我不理解的错误问题。
以下是两个相关文件:
在 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调用,该调用失败,并显示运行时检查失败#0消息。
运行时检查失败#0 - 值 ESP没有正确保存 功能调用。这通常是一个 调用函数声明的结果 用一个调用约定 用a声明的函数指针 不同的召集惯例。
我已经注意到其他地方报告的__stdcall问题,但正如您在上面所看到的那样,我已经包含了这个问题,我甚至强迫项目属性中的__stdcall调用约定(MSVS 2010)。关于为什么我只能在定时器功能上而不是在init或释放功能上得到错误的任何想法?
答案 0 :(得分:1)
或许想一想,如果你在LogRelease()之前调用LogTimer()?
那么将正确的参数传递给Initialize和SetTimer呢?
答案 1 :(得分:0)
那么,
不完全确定原因,但在发布时编译工作正常。我更改了函数的名称,现在它在调试和发布模式下工作正常=)!
非常感谢你们!