![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать PControl в процедуру dll
Dmitry___ © (2007-04-30 11:22:00)Надо передать в процедуру dll экземпляр PControl. Как это сделать правильно?
Посоветуйте, кому не жалко :)
D[u]fa (2007-05-01 19:34:00) [1]давай, тебе на мыло отписал
Dmitry___ (2007-05-01 17:35:00) [2]Можно на мыло отпишусь?
D[u]fa (2007-05-01 16:59:00) [3]Dmitry___, на ошибки в пустом проекте можешь внимания не обращать, вроде мемпруф не прально опр.
а что за проект такой? выложил бы сорс.
я юзал сам кол и плагины в которых были Pcontrol'ы и норм было все
Dmitry___ (2007-05-01 15:51:00) [4]D[u]fa
> Dmitry___ , совет поставь мемпруф и гоняй прогу на ней
Ужо поставил, гоняю. Тока она что-то очень много ошибок находит даже на пустом проекте, ошибки типа неверных дескрипторов меню и пр. Может, я пока ещё не умею пользовать :)
> передавай тока числа и PChar
> <Цитата>
Так и делаю в принципе. Только передаю ещё указатель на свою структуру, но это не страшно. А про контролы я просто так спросил, интересно же :)
To Vladimir Kladov
Я бы всё-таки хотел разобраться с динамической загрузкой длл-ок. Если вам есть, что посоветовать, и вам не будет трудно, не могли бы вы просветить меня, куда хотя бы копать? А то такой проект классный валится, и всё из-за этой баги. Если нужно, пришлю наброски проги и библиотек, подробнейшим образом опишу проблему и т.д., всё, что нужно, только помогите решить её!
D[u]fa (2007-05-01 10:22:00) [5]Dmitry___, совет поставь мемпруф и гоняй прогу на ней. Не передавай тип стринг и лучше не юзай ShareMem, а как говорит Владимир передавай тока числа и PChar
Vladimir Kladov (2007-05-01 09:44:00) [6]Простейший - не передавать. Только дескрипторы, числа и PChar. Причем высвобождать память, выделенную в одном, не освобождать в другом.
Dmitry___ (2007-04-30 22:35:00) [7]Т.е., если я правильно вас понял, те проблемы, что мы имеем с формами в длл в случае динамической загрузки (кстати, что-то заглохла тема), может быть вызвана ошибкой, ноги у которой растут от менеджера памяти?
> Borland предлагает свой способ, его можно прочитать в комментариях
> сгенерированного модуля проекта, когда вы создаете новую
> dll. Но это потянет изрядно кода.
ShareMem? Не вариант. А какой способ вы можете посоветовать?
Vladimir Kladov (2007-04-30 22:09:00) [8]На самом деле, основная проблема - в менеджере памяти. Точнее в менеджерах. Как только вы начнете пользоваться методами объекта / класса, да даже и AnsiString'ом переданным из основной программы, там начнутся где-то делаться обращения к менеджеру. Если в dll попытаться освободить память, принадлежащую менеджеру программы, или наоборот, то получится сгенерированный меджером AV. А если не получится, то AV получится позже, потому что будет нарушена структура кучи. Borland предлагает свой способ, его можно прочитать в комментариях сгенерированного модуля проекта, когда вы создаете новую dll. Но это потянет изрядно кода.
Dmitry___ (2007-04-30 19:40:00) [9]
> А ежели не работает то зачем усложнять себе жизнь.
Ну теперь я понял ;)
Compiler (2007-04-30 17:55:00) [10]
> Так если бы не проверил, не спрашивал бы. Не работает
А ежели не работает то зачем усложнять себе жизнь.
> А почему @имя = GetProcAddress
Наверное поэтому:
FARPROC = Pointer;
...
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;
и без собаки не пробовал, хотя работает.
D[u]fa (2007-04-30 17:35:00) [11]А уже делфи просто понимает, че от нее требуют)
Vladimir Kladov (2007-04-30 17:02:00) [12]Объект или класс не должен передаваться между dll и программой. Фактически при этом передается указатель на структуру в памяти, и правильная работа гарантируется только в случае, если в обоих проектах используется тождественная структура. Достаточно представить, что случится, если один из компонентов тандема программа-dll будет перекомпилирован с другим составом полей в этой структуре (что, кстати, может в случае KOL зависеть от набора символов условной компиляции): все поля сдвинутся, вызов метода может привести не к тем результатам, какие ожидались. Так же напоминаю, что в dll и программе могут быть разные менеджеры памяти.
А почему @имя = GetProcAddress... ? Я собаку никогда не пишу, все равботает и так.
Dmitry___ (2007-04-30 15:41:00) [13]Так если бы не проверил, не спрашивал бы. Не работает: АВ
Compiler (2007-04-30 15:21:00) [14]
> А можно ли передать функции в качестве параметра .Form или
> Applet?
А проверить слабо?
Dmitry___ (2007-04-30 12:55:00) [15]Спасибо, добрый человек :)
А можно ли передать функции в качестве параметра .Form или Applet?
Compiler (2007-04-30 12:36:00) [16]Не жалко!
//Библиотека
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;