Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизВызов DLL, написанной на C++ Найти похожие ветки
← →
kalliopiy (2003-12-15 18:25) [0]Здравствуйте!
Надеюсь Мастера есть на все руки, т.е. разбирающиеся и в C++ тоже. Итак есть проблема вызова функции из DLL, написанной на С++ (не знаю точно на Visual или на Builder, т.к. написана она не мной). В DLL-ке есть функция TermoProperties, которую мне и нужно использовать. В заголовочном файле DLL-ки *.h описано это дело так
#ifdef TERMO__DLL_EXPORTS
#define TERMO__DLL_API __declspec(dllexport)
#else
#define TERMO__DLL_API __declspec(dllimport)
#endif
struct TermoRes{double H, S, Cp, Cv, U, G, A;};
TERMO__DLL_API int TermoProperties(char Name[20], double T, char Phase, TermoRes &Result) ;
Из Делфи я вызываю ее следующим образом (простое консольное приложение - для проверки)
program test;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows;
var dllHandle: THandle;
begin
dllHandle:=LoadLibrary("D:\Test\Dll\Termo__Dll.dll");
if dllHandle <> 0 then
begin
GetProcAddress(dllHandle,"TermoProperties");
writeln("Error #"+inttostr(GetLastError));
end
else writeln("Unable to load DLL");
readln;
end.
Так вот программа-то эта выдает Error #127, что собственно соответствует константе ERROR_PROC_NOT_FOUND и на человеческом языке означает, что указанная процедура не найдена. Что же мне делать? Подскажите, пожалуйста. Ведь простенький тестовый пример, написанный на Borland C++ Builder вполне нормально справляется с вызовом этой функции.
← →
PVOzerski (2003-12-15 18:30) [1]Начните с того, что посмотрите, в каком виде имя этой функции экспортируется (всевозможные подчерки, цифры...). Утилита TDUMP Вам поможет. Потом разберитесь с соглашениями о передаче параметров.
← →
kalliopiy (2003-12-15 18:45) [2]Спасибо.
Вы уж простите, но я никогда не пользовался tdump и вот попробовал его запустить следующим образом
tdump -ea termo__Dll.dll
И вот он мне выдал кучу какой-то информации, а в конце
Exports from Termo__Dll.dll
1 exported name(s), 1 export addresse(s). Ordinal base is 1.
Not sorted
RVA Ord. Hint Name
-------- ---- ---- ----
00004BC0 1 0000 ?TermoProperties@@YAHQADNDAAUTermoRes@@@Z
Так это что - неужели функция экспортируется именно с таким именем? И правильно ли я вызвал tdump.
-------------
По поводу соглашений о передаче параметров - я специально написал такой пример, чтобы показать, что не удается даже просто получить адрес необходимой функции, уже не говоря о ее вызове (т.е. вопросы с параметрами и пр. не возникают пока)
← →
Skier (2003-12-15 18:53) [3]>kalliopiy © (15.12.03 18:25)
А ты не пробовал проверять что возвращает GetProcAddress ?!
← →
kalliopiy (2003-12-15 18:57) [4]
> Skier © (15.12.03 18:53) [3]
Естественно пробовал - возвращает nil! Поэтому и вызываю GetLastError, чтобы выяснить, что там не так. Если бы все было OK, то должно было бы выдавать"Error #0"
, т.е. ошибок нет.
← →
Skier (2003-12-15 19:05) [5]>kalliopiy © (15.12.03 18:57) [4]
А если "использовать" TermoProperties статически, а не динамически ?
← →
Dimka Maslov (2003-12-15 19:17) [6]Нужно и вызывать GetProcAddress вот с этим именем:
?TermoProperties@@YAHQADNDAAUTermoRes@@@Z
а если статически линковать то писать надо
function TermoProperties(...): Integer cdecl;
external "termo__dll.dll" name "?TermoProperties@@YAHQADNDAAUTermoRes@@@Z";
← →
kalliopiy (2003-12-15 19:22) [7]
> Skier © (15.12.03 19:05) [5]
Хм...
Статически, вообще-то - та же ситуация. При запуске говорит - не удалось найти точку входа в процедуру TermoProperties и естественно не запускается.
Но я попробовал написать
function termoProcStatic (name: TElemName; T: double;
Phase : char;
var Result: TTermoRes): integer; stdcall;
external "termo__Dll.dll" name "?TermoProperties@@YAHQADNDAAUTermoRes@@@Z";
и заработало... Т.е. уже оно там что-то находит, ну в смысле точку входа... :))
← →
kalliopiy (2003-12-15 19:43) [8]Огромное спасибо!
> PVOzerski © (15.12.03 18:30) [1]
> Dimka Maslov © (15.12.03 19:17) [6]
> Skier © (15.12.03 19:05) [5]
За дельные советы и отзывчивость. Вызываю динамически именно с этим кривым именем "?TermoProperties@@YAHQADNDAAUTermoRes@@@Z".
Кто же знал, что оно таким глючным образом экспортируется. Я предполагал, что должны быть утилитки, которые позволяют узнать имена экспортируемых из dll функций, но не знал где ее взять. А она оказывается была тут как тут... Огромнейшее спасибо еще раз за подсказку!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c