Форум: "KOL";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];
ВнизПередать 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 вся ветка
Форум: "KOL";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.048 c