DLL GetProcAddress问题 - 另一个运行时检查失败

时间:2011-04-03 23:58:04

标签: c++ visual-studio-2010

好吧,我遇到了一些我不理解的错误问题。

以下是两个相关文件:

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或释放功能上得到错误的任何想法?

2 个答案:

答案 0 :(得分:1)

或许想一想,如果你在LogRelease()之前调用LogTimer()?

那么将正确的参数传递给Initialize和SetTimer呢?

答案 1 :(得分:0)

那么,

不完全确定原因,但在发布时编译工作正常。我更改了函数的名称,现在它在调试和发布模式下工作正常=)!

非常感谢你们!