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

Вниз

Передать PControl в процедуру dll   Найти похожие ветки 

 
Dmitry___   (2007-04-30 11:22) [0]

Надо передать в процедуру dll экземпляр PControl. Как это сделать правильно?

Посоветуйте, кому не жалко :)


 
Compiler ©   (2007-04-30 12:36) [1]

Не жалко!


//Библиотека
library Library_1;

uses
 Windows,
 Messages,
 KOL;

procedure AssignControl(Control:Pcontrol); stdcall;
begin
//Делаем что-нибудь с участием Control
Showmessage(control.Text);
end;

exports
 AssignControl name "AssignControl";
end.
//***********************************

//Вызов из программы
procedure TForm1.Button1Click(Sender: PObj);
var
 FLibHandle: THandle;
 AssignControl:procedure(Control:Pcontrol ); stdcall;
 begin
FLibHandle := LoadLibrary("Library_1.DLL");
 if FLibHandle = 0 then Exit;
 @AssignControl := GetProcAddress(FLibHandle, "AssignControl");
 if not Assigned(AssignControl) then
 begin
   FreeLibrary(FLibHandle);
   exit;
 end;
 AssignControl(Button1);
end;



 
Dmitry___   (2007-04-30 12:55) [2]

Спасибо, добрый человек :)

А можно ли передать функции в качестве параметра .Form или Applet?


 
Compiler ©   (2007-04-30 15:21) [3]


> А можно ли передать функции в качестве параметра .Form или
> Applet?

А проверить слабо?


 
Dmitry___   (2007-04-30 15:41) [4]

Так если бы не проверил, не спрашивал бы. Не работает: АВ


 
Vladimir Kladov   (2007-04-30 17:02) [5]

Объект или класс не должен передаваться между dll и программой. Фактически при этом передается указатель на структуру в памяти, и правильная работа гарантируется только в случае, если в обоих проектах используется тождественная структура. Достаточно представить, что случится, если один из компонентов тандема программа-dll будет перекомпилирован с другим составом полей в этой структуре (что, кстати, может в случае KOL зависеть от набора символов условной компиляции): все поля сдвинутся, вызов метода может привести не к тем результатам, какие ожидались. Так же напоминаю, что в dll и программе могут быть разные менеджеры памяти.

А почему @имя = GetProcAddress... ? Я собаку никогда не пишу, все равботает и так.


 
D[u]fa ©   (2007-04-30 17:35) [6]

А уже делфи просто понимает, че от нее требуют)


 
Compiler ©   (2007-04-30 17:55) [7]


> Так если бы не проверил, не спрашивал бы. Не работает

А ежели не работает то зачем усложнять себе жизнь.


> А почему @имя = GetProcAddress


Наверное поэтому:

FARPROC = Pointer;
...
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;

и без собаки не пробовал, хотя работает.


 
Dmitry___   (2007-04-30 19:40) [8]


> А ежели не работает то зачем усложнять себе жизнь.

Ну теперь я понял ;)


 
Vladimir Kladov   (2007-04-30 22:09) [9]

На самом деле, основная проблема - в менеджере памяти. Точнее в менеджерах. Как только вы начнете пользоваться методами объекта / класса, да даже и AnsiString"ом переданным из основной программы, там начнутся где-то делаться обращения к менеджеру. Если в dll попытаться освободить память, принадлежащую менеджеру программы, или наоборот, то получится сгенерированный меджером AV. А если не получится, то AV получится позже, потому что будет нарушена структура кучи. Borland предлагает свой способ, его можно прочитать в комментариях сгенерированного модуля проекта, когда вы создаете новую dll. Но это потянет изрядно кода.


 
Dmitry___   (2007-04-30 22:35) [10]

Т.е., если я правильно вас понял, те проблемы, что мы имеем с формами в длл в случае динамической загрузки (кстати, что-то заглохла тема), может быть вызвана ошибкой, ноги у которой растут от менеджера памяти?


> Borland предлагает свой способ, его можно прочитать в комментариях
> сгенерированного модуля проекта, когда вы создаете новую
> dll. Но это потянет изрядно кода.

ShareMem? Не вариант. А какой способ вы можете посоветовать?


 
Vladimir Kladov   (2007-05-01 09:44) [11]

Простейший - не передавать. Только дескрипторы, числа и PChar. Причем высвобождать память, выделенную в одном, не освобождать в другом.


 
D[u]fa ©   (2007-05-01 10:22) [12]

Dmitry___ , совет поставь мемпруф и гоняй прогу на ней. Не передавай тип стринг и лучше не юзай ShareMem, а как говорит Владимир передавай тока числа и PChar


 
Dmitry___   (2007-05-01 15:51) [13]

D[u]fa

> Dmitry___ , совет поставь мемпруф и гоняй прогу на ней

Ужо поставил, гоняю. Тока она что-то очень много ошибок находит даже на пустом проекте, ошибки типа неверных дескрипторов меню и пр. Может, я пока ещё не умею пользовать :)

> передавай тока числа и PChar
> <Цитата>

Так и делаю в принципе. Только передаю ещё указатель на свою структуру, но это не страшно. А про контролы я просто так спросил, интересно же :)

To Vladimir Kladov
Я бы всё-таки хотел разобраться с динамической загрузкой длл-ок. Если вам есть, что посоветовать, и вам не будет трудно, не могли бы вы просветить меня, куда хотя бы копать? А то такой проект классный валится, и всё из-за этой баги. Если нужно, пришлю наброски проги и библиотек, подробнейшим образом опишу проблему и т.д., всё, что нужно, только помогите решить её!


 
D[u]fa ©   (2007-05-01 16:59) [14]

Dmitry___ , на ошибки в пустом проекте можешь внимания не обращать, вроде мемпруф не прально опр.

а что за проект такой? выложил бы сорс.

я юзал сам кол и плагины в которых были Pcontrol"ы и норм было все


 
Dmitry___   (2007-05-01 17:35) [15]

Можно на мыло отпишусь?


 
D[u]fa ©   (2007-05-01 19:34) [16]

давай, тебе на мыло отписал



Страницы: 1 вся ветка

Текущий архив: 2007.11.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
15-1193301218
infom
2007-10-25 12:33
2007.11.25
Храние exe в StarTeam.


3-1183988425
Krants
2007-07-09 17:40
2007.11.25
Control cтолбцов для DBGrid


15-1193300031
БарЛог
2007-10-25 12:13
2007.11.25
Изображение на мониторе приближается-отдаляется


15-1193345938
Kick
2007-10-26 00:58
2007.11.25
Как на блок-схеме изобразить функции?


2-1194020500
mufan
2007-11-02 19:21
2007.11.25
Неразрывный пробел и замена в тексте!