Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com
Здравствуйте AAS, Вы писали:
AAS>Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com
В смысле — исходники? Никак.
Или описания? Имена экспортируемых функций — легко, через tdump, например. Параметры — никак, только если попытаться догадаться под отладчиком
Здравствуйте AAS, Вы писали:
AAS>Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com
Хэдер длли есть? Если да, то в юните нужно объявить нужную функцию согласно прототипу из хэдера. Смотри хэлп. Или давай хэдер, изобразим.
Здравствуйте Игорь Вартанов, Вы писали:
ИВ>Здравствуйте AAS, Вы писали:
AAS>>Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com
ИВ>Хэдер длли есть? Если да, то в юните нужно объявить нужную функцию согласно прототипу из хэдера. Смотри хэлп. Или давай хэдер, изобразим.
Я делал так :
В Билдере File..New..DLL
Далее по всем правилам ваяем DLL-ку, ну например:
Здравствуйте AAS, Вы писали:
А>>Procedure TEST(I : Integer);STDCALL; External 'имя.DLL';
AAS>У меня заработало так: AAS>extern "C" __declspec(dllexport) __stdcall TEST(int i);
AAS>тогда в Дельфи просто: AAS>Procedure TEST(I : Integer); External 'имя.DLL';
А где ты делфе указал, что вызов __stdcall, если в билдере его поставил? Хотя возможно по умолчанию принимается как STDCALL, но явно указать не помешает.
Об экспорте extern "C" функций у Борланда, который C/C++:
Если в билдере функция SomeFunc объявлена как __cdecl, то ее имя экспортируется как _SomeFunc. Если __stdcall, то имя будет выглядеть как SomeFunc (неискаженное).
Первый случай в делфе будет выглядеть как
Function _SomeFunc(<...>):<return_type>; cdecl; external 'имя.dll';
Второй —
Function SomeFunc(<...>):<return_type>; stdcall; external 'имя.dll';
---
С уважением,
Игорь
Re[6]: DLL в Delphi и C++Builder
От:
Аноним
Дата:
19.02.02 19:34
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:
ИВ>Здравствуйте AAS, Вы писали:
А>>>Procedure TEST(I : Integer);STDCALL; External 'имя.DLL';
AAS>>У меня заработало так: AAS>>extern "C" __declspec(dllexport) __stdcall TEST(int i);
AAS>>тогда в Дельфи просто: AAS>>Procedure TEST(I : Integer); External 'имя.DLL';
ИВ>А где ты делфе указал, что вызов __stdcall, если в билдере его поставил? Хотя возможно по умолчанию принимается как STDCALL, но явно указать не помешает.
ИВ>Об экспорте extern "C" функций у Борланда, который C/C++:
ИВ>Если в билдере функция SomeFunc объявлена как __cdecl, то ее имя экспортируется как _SomeFunc. Если __stdcall, то имя будет выглядеть как SomeFunc (неискаженное).
ИВ>Первый случай в делфе будет выглядеть как
ИВ>Function _SomeFunc(<...>):<return_type>; cdecl; external 'имя.dll';
ИВ>Второй —
ИВ>Function SomeFunc(<...>):<return_type>; stdcall; external 'имя.dll';
Ну да ! Конечно в Дельфи STDCALL тоже надо, а то траблы...
А через cdecl и _SomeFunc у меня не получилось...
Еще раз спасибо за советы ! :)
Здравствуйте Аноним, Вы писали:
А>А через cdecl и _SomeFunc у меня не получилось...
Нда... Это плохо, что не получилось. Возможно, что я уже что-то путаю, пора освежить память. Завтра на работе попробую "как там избы делают". :-)
---
С уважением,
Игорь
Re: DLL в Delphi и C++Builder
От:
Аноним
Дата:
20.02.02 21:58
Оценка:
У меня тоже беда:
вот такую простую вещь не могу заставить работать:
экспортирую из DLL (под Builder'ом) эту функцию
TForm* func(TForm* frm, TComponent* comp);
Во-первых непонятно, как ее описать на Opascal, а если описываю,как
function func(var AROI: TForm; var AComponent: TComponent) : TForm; stdcall; external 'my.dll';
то она привызове возвращает какой-то хлам.
Чего делать — непонятно.
Re[2]: DLL в Delphi и C++Builder
От:
Аноним
Дата:
20.02.02 22:00
Оценка:
Здравствуйте Аноним, Вы писали:
А>У меня тоже беда: А>вот такую простую вещь не могу заставить работать: А>экспортирую из DLL (под Builder'ом) эту функцию А>TForm* func(TForm* frm, TComponent* comp);
а код функции вот такой:
TForm* func(TForm* frm, TComponent* comp) {
return frm;
}
Здравствуйте Аноним, Вы писали:
А>У меня тоже беда: А>вот такую простую вещь не могу заставить работать: А>экспортирую из DLL (под Builder'ом) эту функцию А>TForm* func(TForm* frm, TComponent* comp);
А>Во-первых непонятно, как ее описать на Opascal, а если описываю,как А>function func(var AROI: TForm; var AComponent: TComponent) : TForm; stdcall; external 'my.dll';
А>то она привызове возвращает какой-то хлам. А>Чего делать — непонятно.
Вообще-то, TForm в Билдере и Дальфи — это НЕМНОГО разные вещи
Единственный способ — передать Handle формы, и извращаться с ним.
OK
Re[3]: DLL в Delphi и C++Builder
От:
Аноним
Дата:
20.02.02 22:14
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Вообще-то, TForm в Билдере и Дальфи — это НЕМНОГО разные вещи :))
Серьезно? А как же так: паскалевский код автоматически генерится в .obj и интерфейс .hpp
ВГ>Единственный способ — передать Handle формы, и извращаться с ним.
Дело даже не в самой форме, дело вообще в передаче объектов: с указателем на TComponent что делать?
А>Дело даже не в самой форме, дело вообще в передаче объектов: с указателем на TComponent что делать?
А ничего не делать... Это же паскалевкий класс, он к С++ никакого отношения не имеет.
Если же ф-ия ничего не делает, а возвращается хлам, то проверь то, как она экспортируется — stdcall или
ещё как?
P.S. А если и библиотеку на паскале написать?
OK
Re[5]: DLL в Delphi и C++Builder
От:
Аноним
Дата:
20.02.02 22:37
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>А ничего не делать... Это же паскалевкий класс, он к С++ никакого отношения не имеет.
Если ничего не делать, то ничего работать не будет.
ВГ>Если же ф-ия ничего не делает, а возвращается хлам, то проверь то, как она экспортируется — stdcall или ВГ>ещё как?
Правильно ли я описал прототип ф-ции в Opascal, вот где проблема может быть.
ВГ>P.S. А если и библиотеку на паскале написать?
То вопроса бы не было:)
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>>А ничего не делать... Это же паскалевкий класс, он к С++ никакого отношения не имеет.
А>Если ничего не делать, то ничего работать не будет.
Значит, не надо передавать объекты. Или сделать в DLL специальную функцию-обертку именно для Паскаля.
Что-то типа: InsertComponent(ClassName: PChar, ComponentName: PChar). А что надо в DLL с компонентом
делать, если не секрет?
ВГ>>Если же ф-ия ничего не делает, а возвращается хлам, то проверь то, как она экспортируется — stdcall или ВГ>>ещё как?
А>Правильно ли я описал прототип ф-ции в Opascal, вот где проблема может быть.
Я имел в виду что в Билдере она может быть описана cdecl, а в Паскале stdcall.
ВГ>>P.S. А если и библиотеку на паскале написать? А>То вопроса бы не было
Вот user32.dll на С писан, а юзают его все, кто хочет
OK
Re[7]: DLL в Delphi и C++Builder
От:
Аноним
Дата:
20.02.02 22:59
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Значит, не надо передавать объекты. Или сделать в DLL специальную функцию-обертку именно для Паскаля. ВГ>Что-то типа: InsertComponent(ClassName: PChar, ComponentName: PChar). А что надо в DLL с компонентом ВГ>делать, если не секрет?
Ну как это не надо?:) Очень нужно. В DLL нужно пройтись по всем свойствам компонента. Кое-какие изменить надо.
ВГ>Я имел в виду что в Билдере она может быть описана cdecl, а в Паскале stdcall.
Да я пробовал и cdecl, и stdcall. Мне никто ответить не может: каким будет прототип этой функции в Opascal.
ВГ>Вот user32.dll на С писан, а юзают его все, кто хочет :)
А>Да я пробовал и cdecl, и stdcall. Мне никто ответить не может: каким будет прототип этой функции в Opascal.
Прототип для Паскаля:
function func(AROI, AComponent: DWORD): DWORD; stdcall; external 'my.dll'
Это самый дубовый вариант, но реально параметры передаются только как DWORD'ы (в stdcall !)
Проблема состоит не в описаннии данной функции на Паскале, а в том, сможет ли
сама функция понять, что ей передали. У TComponent не так много свойст, попробуй
объеденить их в структуру, и передавать указатель на нее (как в WinAPI). Или разберись с
расположением Паскалевкого класса в памяти, преобразуй его в С++, и все будет работать.
P.S. Может COM исправит положение (объекты + независимоть от языка) ?
OK
Re[9]: DLL в Delphi и C++Builder
От:
Аноним
Дата:
20.02.02 23:38
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Прототип для Паскаля:
ВГ>function func(AROI, AComponent: DWORD): DWORD; stdcall; external 'my.dll'
ВГ>Это самый дубовый вариант, но реально параметры передаются только как DWORD'ы (в stdcall !)
Правда? А я думал, что когда не указывают var, то параметры через стек передаются по значению.
ВГ>Проблема состоит не в описаннии данной функции на Паскале, а в том, сможет ли ВГ>сама функция понять, что ей передали.
Да вот ведь:) Не получается отладить и проследить вызов функции из Builder 5 в Delphi 3.
У TComponent не так много свойст, попробуй ВГ>объеденить их в структуру, и передавать указатель на нее (как в WinAPI). Или разберись с ВГ>расположением Паскалевкого класса в памяти, преобразуй его в С++, и все будет работать.
Дело в том, что я этот компонент потом передаю на обработку функциям самого Borland.
ВГ>P.S. Может COM исправит положение (объекты + независимоть от языка) ?