Главная страница
    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.46 MB
Время: 0.007 c
3-86244
vlgrig1961
2003-12-04 08:50
2003.12.26
Как выполнить SELECT из другой базы Oracla!!


7-86564
Ал
2003-10-22 10:14
2003.12.26
Как узнать, что запущен скринсэйвер и корректно завершить его?


3-86281
BlackCat
2003-12-02 19:01
2003.12.26
Несоответствие типов данных в выражении условия отбора.


7-86574
The X
2003-10-21 19:44
2003.12.26
Определение сер. # HDD (заводского)


14-86487
stud
2003-12-05 13:50
2003.12.26
пароли в 2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский