Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.007 c
3-86288
dj-amigo
2003-12-02 20:43
2003.12.26
Сортировка строк в DBGridEh


14-86527
konstantinov
2003-12-03 20:30
2003.12.26
Как удалить запрос на выбор ОС?


3-86258
peypivo
2003-12-03 14:45
2003.12.26
странная таблица


1-86334
Mishenka
2003-12-12 21:43
2003.12.26
Как обнулить содержимое StringGrid?


3-86311
tchn
2003-12-01 22:54
2003.12.26
Required поля?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский