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

C++ DLL GetProcAddress问题-另一个运行时检查失败,c++,visual-studio-2010,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 Funct

嗯,我有一些我不理解的错误问题

以下是两个相关文件:

内部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)
{
    [...]
}
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;
内部DLLExporter.def

LIBRARY DLLExporter.dll
EXPORTS
    Initialize
    Release
    SetTimer 
内部DLLImporter

#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)
{
    [...]
}
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的未正确保存跨 函数调用。这通常是一个 调用已声明函数的结果 用一个呼叫约定和一个 函数指针声明为 不同的呼叫约定


我已经注意到其他地方报告的u stdcall问题,但正如您在上面看到的,我已经包括了这些问题,我甚至在项目属性(MSVS 2010)中强制使用了u stdcall调用约定。有没有想过为什么我只会在timer函数上出错,而不会在init或release函数上出错?

只是想一想,也许在LogRelease()之前调用LogTimer()


传递适当的参数来初始化和设置计时器怎么样?

想想,如果在LogRelease()之前调用LogTimer()

传递适当的参数来初始化和设置计时器怎么样

不完全确定原因,但在发行版中编译效果很好。我更改了函数的名称,现在它可以在调试和发布模式下正常工作=)

非常感谢大家

不完全确定原因,但在发行版中编译效果很好。我更改了函数的名称,现在它可以在调试和发布模式下正常工作=)


非常感谢大家

这是一个win32应用程序。DLLExporter创建DLLExporter.dll DLLImporter创建DLLImporter.exe,在运行时导入DLLExporter.dll这是一个win32应用程序。DLLExporter创建DLLExporter.dll DLLImporter创建DLLImporter.exe,该文件在运行时导入DLLExporter.dll我已经完成了这项工作,但没有对结果更改进行任何更改。当我更改它时,LogTimer仍然出错并生成相同的错误,而LogRelease仍然正常工作。以下链接是与相同问题相关的链接,让我认为它与函数命名和调用中的u stdcall有关,但我不认为这里的情况完全是这样,因为我已经显式地将所有内容更改为使用u stdcall,并且隐式地通过项目设置。我已经做到了这一点,所产生的变化没有任何变化。当我更改它时,LogTimer仍然出错并生成相同的错误,而LogRelease仍然正常工作。以下链接是与相同问题相关的链接,让我认为它与函数命名和调用中的u stdcall有关,但我不认为这里的情况完全是这样,因为我已经显式地将所有内容更改为使用u stdcall,并且隐式地通过项目设置。