Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Импорт функции из dll


Автор: Competitor 7.6.2008, 13:55
Привет всем.
делаю импорт функции так:
Код

HINSTANCE dllInstance;
typedef void* Pointer;
typedef long (*CREATERC4CIPHER)(Pointer cypher, long dwKeyLength);
CREATERC4CIPHER CreateRC4Cipher;

void Cactivexusingtest02Dlg::OnBnClickedButton1()
{
    dllInstance = LoadLibrary("cypher8i.dll");
    CreateRC4Cipher = (CREATERC4CIPHER)GetProcAddress(dllInstance, "CreateRC4Cipher");
    Pointer cypher = 0;
    long rc4Cypher = CreateRC4Cipher(cypher, sizeof(cypher));
}

Однако в строке:
Код

long rc4Cypher = CreateRC4Cipher(cypher, sizeof(cypher));

вылетает ошибка:
Код

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  
This is usually a result of calling a function declared with one calling convention with a function 
pointer declared with a different calling convention.

Как можно решить эту проблему?

Автор: ama_kid 7.6.2008, 14:11
Цитата(Competitor @  7.6.2008,  13:55 Найти цитируемый пост)
Как можно решить эту проблему?
приведя декларацию и реализацию вызываемой функции к единому соглашению о параметрах. Попробуй добавить __stdcall

Автор: Rififi 7.6.2008, 14:14
Цитата(Competitor @  7.6.2008,  13:55 Найти цитируемый пост)
Как можно решить эту проблему?

описать правильно прототип функции с явным указанием calling convention

typedef long ([__cdecl|__stdcall|__fastcall] *CREATERC4CIPHER)(Pointer cypher, long dwKeyLength);

Автор: Competitor 7.6.2008, 14:26
ama_kid, 
Rififi, 
спасиб, вот так работает:
Код

typedef long (__stdcall *CREATERC4CIPHER)(char* buff, long dwKeyLength);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)