DLL в Delphi и C++Builder
От: AAS  
Дата: 11.02.02 10:40
Оценка:
Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com
Re: DLL в Delphi и C++Builder
От: Yurik США  
Дата: 12.02.02 02:18
Оценка:
Здравствуйте AAS, Вы писали:

AAS>Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com

В смысле — исходники? Никак.
Или описания? Имена экспортируемых функций — легко, через tdump, например. Параметры — никак, только если попытаться догадаться под отладчиком
Re: DLL в Delphi и C++Builder
От: Игорь Вартанов Ниоткуда  
Дата: 12.02.02 10:20
Оценка:
Здравствуйте AAS, Вы писали:

AAS>Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com


Хэдер длли есть? Если да, то в юните нужно объявить нужную функцию согласно прототипу из хэдера. Смотри хэлп. Или давай хэдер, изобразим.
---
С уважением,
Игорь
Re[2]: DLL в Delphi и C++Builder
От: AAS  
Дата: 12.02.02 18:05
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

ИВ>Здравствуйте AAS, Вы писали:


AAS>>Люди!!! HELP!!! Как в Дельфи из DLL-ки сваянной под Билдер вытянуть процедуры??? Это вообще можно сделать ? Кто знает плиз, намыльте на umpot@fromru.com


ИВ>Хэдер длли есть? Если да, то в юните нужно объявить нужную функцию согласно прототипу из хэдера. Смотри хэлп. Или давай хэдер, изобразим.



Я делал так :
В Билдере File..New..DLL
Далее по всем правилам ваяем DLL-ку, ну например:

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
void __declspec(dllexport) TEST(int i); // Типа прототип

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------
void TEST(int i);
void TEST(int i) // Тело
{
...
}

Затем Run..Run получаем DLL

Далее пытаюсь вызвать эту процедуру из Дельфи:

Procedure TEST(I : Integer); External 'имя.DLL'; // Прототип

// И непосредственно вызов
TEST(i); // i переменная типа Integer;

Тут я обламывабсь она не вызывается, хотя билдеровское приложение с ней работать может.
Но мне позарез нужен вызов из Дельфи ! PLEASE HELP !!!
Re[3]: DLL в Delphi и C++Builder
От: Аноним  
Дата: 12.02.02 19:36
Оценка:
Procedure TEST(I : Integer);STDCALL; External 'имя.DLL';
Re[4]: DLL в Delphi и C++Builder
От: AAS  
Дата: 13.02.02 19:50
Оценка: 3 (1)
Здравствуйте Аноним, Вы писали:

А>Procedure TEST(I : Integer);STDCALL; External 'имя.DLL';


Фенькс !!!

У меня заработало так:
extern "C" __declspec(dllexport) __stdcall TEST(int i);

тогда в Дельфи просто:
Procedure TEST(I : Integer); External 'имя.DLL';

Еще раз Спасибо !
Re[5]: DLL в Delphi и C++Builder
От: Игорь Вартанов Ниоткуда  
Дата: 14.02.02 15:10
Оценка:
Здравствуйте 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 у меня не получилось...
Еще раз спасибо за советы ! :)
Re[7]: DLL в Delphi и C++Builder
От: Игорь Вартанов Ниоткуда  
Дата: 19.02.02 20:19
Оценка:
Здравствуйте Аноним, Вы писали:

А>А через 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;
}
Re[2]: DLL в Delphi и C++Builder
От: Владимир Гренадеров Россия  
Дата: 20.02.02 22:02
Оценка:
Здравствуйте Аноним, Вы писали:

А>У меня тоже беда:

А>вот такую простую вещь не могу заставить работать:
А>экспортирую из 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 что делать?
Re[4]: DLL в Delphi и C++Builder
От: Владимир Гренадеров Россия  
Дата: 20.02.02 22:28
Оценка:
Здравствуйте Аноним, Вы писали:


А>Дело даже не в самой форме, дело вообще в передаче объектов: с указателем на TComponent что делать?


А ничего не делать... Это же паскалевкий класс, он к С++ никакого отношения не имеет.

Если же ф-ия ничего не делает, а возвращается хлам, то проверь то, как она экспортируется — stdcall или
ещё как?

P.S. А если и библиотеку на паскале написать?
OK
Re[5]: DLL в Delphi и C++Builder
От: Аноним  
Дата: 20.02.02 22:37
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>А ничего не делать... Это же паскалевкий класс, он к С++ никакого отношения не имеет.


Если ничего не делать, то ничего работать не будет.

ВГ>Если же ф-ия ничего не делает, а возвращается хлам, то проверь то, как она экспортируется — stdcall или

ВГ>ещё как?

Правильно ли я описал прототип ф-ции в Opascal, вот где проблема может быть.

ВГ>P.S. А если и библиотеку на паскале написать?

То вопроса бы не было:)
Re[6]: DLL в Delphi и C++Builder
От: Владимир Гренадеров Россия  
Дата: 20.02.02 22:46
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Владимир Гренадеров, Вы писали:


ВГ>>А ничего не делать... Это же паскалевкий класс, он к С++ никакого отношения не имеет.


А>Если ничего не делать, то ничего работать не будет.


Значит, не надо передавать объекты. Или сделать в 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 на С писан, а юзают его все, кто хочет :)


Да у Borland проблема экспорта класса из DLL.
Re[8]: DLL в Delphi и C++Builder
От: Владимир Гренадеров Россия  
Дата: 20.02.02 23:10
Оценка:
Здравствуйте Аноним, Вы писали:


А>Да я пробовал и 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 исправит положение (объекты + независимоть от языка) ?


Ну это край:)
Re[10]: DLL в Delphi и C++Builder
От: grenader Россия  
Дата: 21.02.02 00:41
Оценка:
Пишем на Дельфи:

function func(p1: TForm; p2: TComponent): TForm; stdcall;
begin
Result := p1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
x: TForm;
begin
x := func(Form1, Button1);
end;

А вот что выдал дизассемблер (гадости-то сколько всякой):

CODE:0045B720 ; --------------- S U B R O U T I N E ---------------------------------------
CODE:0045B720
CODE:0045B720 ; Attributes: bp-based frame
CODE:0045B720
CODE:0045B720 sub_45B720 proc near ; CODE XREF: _TForm1_Button1Click+1Cp
CODE:0045B720
CODE:0045B720 var_4 = dword ptr -4
CODE:0045B720 arg_0 = dword ptr 8
CODE:0045B720
CODE:0045B720 push ebp
CODE:0045B721 mov ebp, esp
CODE:0045B723 push ecx
CODE:0045B724 mov eax, [ebp+arg_0] ; вот так изврат !
CODE:0045B727 mov [ebp+var_4], eax ; оптимизация выкл.
CODE:0045B72A mov eax, [ebp+var_4]
CODE:0045B72D pop ecx
CODE:0045B72E pop ebp
CODE:0045B72F retn 8
CODE:0045B72F sub_45B720 endp
CODE:0045B72F
CODE:0045B72F ; ---------------------------------------------------------------------------
CODE:0045B732 align 4
CODE:0045B734
CODE:0045B734 ; --------------- S U B R O U T I N E ---------------------------------------
CODE:0045B734
CODE:0045B734 ; Attributes: bp-based frame
CODE:0045B734
CODE:0045B734 _TForm1_Button1Click proc near ; DATA XREF: CODE:0045B6E2o
CODE:0045B734
CODE:0045B734 var_C = dword ptr -0Ch
CODE:0045B734 var_8 = dword ptr -8
CODE:0045B734 var_4 = dword ptr -4
CODE:0045B734
CODE:0045B734 push ebp
CODE:0045B735 mov ebp, esp
CODE:0045B737 add esp, 0FFFFFFF4h
CODE:0045B73A mov [ebp+var_C], edx
CODE:0045B73D mov [ebp+var_4], eax
CODE:0045B740 mov eax, [ebp+var_4] ; указатель на что-то в EAX
CODE:0045B743 mov eax, [eax+2F0h] ; что там по смещению 20h в — кнопка!
CODE:0045B749 push eax ; кнопку в стек
CODE:0045B74A mov eax, ds:dword_45DC1C ; Form1 в EAX
CODE:0045B74F push eax ; форму в стек
CODE:0045B750 call sub_45B720 ; вызов функции func
CODE:0045B755 mov [ebp+var_8], eax
CODE:0045B758 mov esp, ebp
CODE:0045B75A pop ebp
CODE:0045B75B retn
CODE:0045B75B _TForm1_Button1Click endp


И что же функции func делать с полученными указателями? Так что языки смешать не получиться ((

А вот если структурку, да еще var, то никих проблем нет !
OK
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.