|
Вопрос # 2 091/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты. Столкунулся с такой проблемой. В общих чертах: у меня есть одна процедура:
procedure Tform1.send(var web,caption,section,blok:string);
begin
{мой код}
end;
в неё передаются параметры при нажатии кнопки, процедура выполняет всё, что должна, но хотел бы у Вас уточнить - хотел выдернуть эту процедуру в DLL и столкнулся с такой проблемой - DLL отказывается работать с моей формой, хотя в uses я её прописал и даже на код вида "Form1.Caption:='DLL работает' она не ругается, но выполнять его не хочет! подскажите пожалуйста, как взаимодействовать с уже созданной формой из DLL
 |
Вопрос задал: CodeR (статус: Посетитель)
Вопрос отправлен: 16 ноября 2008, 16:03
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 17 ноября 2008, 18:32; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 16 ноября 2008, 17:45 [#1]:
Лучше формы в длл не хранить. В целом можно, но надо правильно всё инициализировать, а это уже грязный хак. С другой стороны, а зачем выносить этот код в длл? просто что бы похвалиться перед друзьями?
Или хочеться управлять с длл формой, которая находиться в основном приложении?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
CodeR (статус: Посетитель), 16 ноября 2008, 17:53 [#2]:
Необходимо для собственного развития, а так хочу посмотреть на количество ОП, выделяемой под приложение с DLL и без неё. Есть приложение "Project1.exe" и есть dll "Project2.dll", вот хотелось бы узнать как из Project2.dll управлять формой (Form1) в приложении Project1.exe?
|
|
Вадим К (статус: Академик), 16 ноября 2008, 18:09 [#3]:
Памяти точно больше будет. А управлять - через сообщения. то есть, идея такая. В длл передается хендл нужной формы. И процедура в длл передаёт с помощью сообщений SendMessage|PostMessage "указания".
Только не надо например для того, выставить текст на форме, искать какое это будет сообщение, и как его передать. Если так делать, то теряется всё идея длл как библиотеки кода. Форму можно "научить" реагировать на пользовательские события. И если прийдётся использовать эту длл с другой программой, то её "прикручивание" будет очень простым.
А если хочеться просто длл пописать, то лучше попробовать писать плагины для какого нибудь проекта.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
CodeR (статус: Посетитель), 16 ноября 2008, 18:16 [#4]:
Спасибо, попробую )))
|
|
Feniks (статус: Бакалавр), 17 ноября 2008, 13:21 [#5]:
А если надумаете передавать в DLL строки в переменных, то это должно быть только PChar, а не String.
|
|
Вадим К (статус: Академик), 17 ноября 2008, 13:53 [#6]:
А почему только PChar? WideString чудно передаются и проблем с ними - разве что конвертнуть иногда надо.
Почему с ними нормально? да всё просто. просто эти строки управляются не делфовским менеджером памяти (который у приложения и длл, если не постараться, разный), а виндосовский. А ему побоку, кто строку создал, кто освободил - всё равно один процесс.
В случае с string используется делфовский менеджер памяти (который есть посредником к виндосовскому) и у приложения и у длл он свой, персональный. Теперь, когда мы строку передаем, то на фоне происходят на самом деле хитрые перераспределения памяти и когда один менеджер памяти лезет в хозяйство другого - происходят известные всем глюки.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
CodeR (статус: Посетитель), 17 ноября 2008, 18:32 [#7]:
Написал сегодня свою первую, весомую DLL ))) решил разделить обязательства между DLL и программой. EXE управляет формой, а DLL выполняет и передаёт нужные программе значения, на основе которых форма ведёт себя так или иначе ))) Спасибо за ответы )) Будут проблемы - обращусь )))
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|