Проблема DLL GetProcAddress - еще один сбой проверки во время выполнения - PullRequest
1 голос
/ 04 апреля 2011

Ну, у меня возникли проблемы с ошибкой, которую я не понимаю.

Это два связанных файла:

Внутри 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?

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Просто подумайте, возможно, если вы вызовете LogTimer () перед LogRelease ()?

А как насчет передачи соответствующих параметров в Initialize и SetTimer?

0 голосов
/ 04 апреля 2011

Ну,

Не совсем уверен, почему, но компиляция в выпуске работала нормально.Я изменил название функции, и теперь она отлично работает в режиме отладки и выпуска =)!

всем большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...