Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.26;
Скачать: CL | DM;

Вниз

Вызов 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
3-86290
rel_
2003-11-24 16:11
2003.12.26
DBGrid


3-86275
kostyan
2003-12-03 11:22
2003.12.26
ODBC


1-86388
Dim!S
2003-12-15 08:10
2003.12.26
TDBGridEh и checkbox и расцветка строк


14-86494
Lola
2003-12-04 19:20
2003.12.26
Нужно жилье в Москве


3-86250
Jarra
2003-12-04 02:08
2003.12.26
Lookup и Locate не делают запись активной...