Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Импорт функций из DLL

9.8K
09 ноября 2006 года
lifer
27 / / 30.03.2006
Я не особенно прошарен в длл, и у меня возникла проблема. В длл у меня есть функция, скажем, такая:

extern "C" __declspec(dllexport) bool Test(int a) {Beep(300,300);return true;}
Длл загружается динамически.
extern "C" я добавляю затем, чтобы не было искажения имени и можно было импортировать эту ф-цию в своей проге с помощью GetProcAddress.
Ну и при ее вызове я получаю следующее:The value of ESP was not properly saved across a funtion call и всякая лабуда насчет различия декларации ф-ции в длл и указателя на нее в программе.
В программе импорт выглядит так:

typedef bool (WINAPI* TEST)(int);
TEST Test;
Test=(Test)GetProcAddress(dll,"Test");
bool t=Test(4);

Причем функция выполняется, ошибка при выходе из фукции и связана с параметрами и стеком. Если сделать ф-цию без параметров, то все отлично.Calling convention в настройках длл и проги __cdecl. Если убрать extern "C" и поставить везде __fastcall или __stdcall, то вообще ничего не работает. Длл создается в CPP коде - для информации.
Подскажите пожалуйста, как решить проблему.
63
09 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Причина в том, что ты, как сказал, используешь везде __cdecl, а WINAPI определен в файле windef.h как __stdcall. Если надо использовать формат вызова __cdecl, пиши как WINAPIV.
Ты не сказал, что именно не работает, когда включаешь другой calling convention.
И лучше не писать extern "C", а для спасения от искажения добавить в папку sourse проекта файл ***.def, и в него добавить
EXPORTS
TEST
Хотя, вообще, вызывать функции из динамически загруженной либы можно и без этого, если и то и то пишешь одним компилером.
9.8K
10 ноября 2006 года
lifer
27 / / 30.03.2006
Спасибо за ответ, я явно указываю вместо WINAPI __cdecl как в настройках длл. А насчет def-файла...Так откуда его бы еще взять? Просто я моделирую ситуацию, когда у тебя нет ни lib-файла, ни def-файла, а знаешь только имя одной единственной функции.Поэтому, кроме как extern "C" я другого способа не знаю.
63
10 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Зачем тебе lib - файл? Он тебе понадобится только при компиляции приложения, и то если ты будешь юзать неявную загрузку dll. Если его нет, а есть, например, только бинарник dll, его можно создать утилитой implib, вызываешь "implib.exe mydll.lib mydll.dll", она в BS входит. Ты пишешь dll, у тебя есть функция, которую ты экспортируешь. В папку sourse проекта Dll добавь файл somename.def, и в него добавить строки
EXPORTS
TEST // имя твоей фунции
Или я что то не так понял в проблеме?:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог