Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1193238321
@!!ex
2007-10-24 19:05
2007.11.25
Проблемы с видухой.


15-1192786848
de.
2007-10-19 13:40
2007.11.25
Среда разработки


2-1194021209
Riply
2007-11-02 19:33
2007.11.25
Не юникодные платформы.


2-1193782252
vr-online
2007-10-31 01:10
2007.11.25
Жрет память


11-1177917769
Dmitry___
2007-04-30 11:22
2007.11.25
Передать PControl в процедуру dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский