Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про DLL и свойство Application.Handle   Найти похожие ветки 

 
KSergey   (2003-08-26 08:48) [0]

Как все знаю, в книжках по Delphi при описании создания DLL указано, что если DLL содержит формы, то необходимо свойству Application.Handle DLL-библиотеки присваивать аналогичное свойство вызывающего ее приложения.
Все бы прикольно, вот только дальше обязательно пишут, что DLL - это круто, ее можно вызывать из любого приложения, написанного на любом языке. Это, безусловно, верно, вот только маленький нюанс: а чего же тогда в эту самую Application.Handle DLL-библиотеки пихать-то? Например, при вызове из Access?
Я даже больше скажу. DLL у меня вызывает приложение вообще без форм, по сути маленький такой пускачек подгружающий библиотеку и передаещий ей управление. Даже окна нет. А что в этом случае пихать в этот Handle, при том, что тип его - HWND? Где ж я ему этот хендл окна-то возьму? Или придется создать невидимое окно?
А без этого (наверное без этого) каждая модальная форма из DLL (если их несколько последовательно открывается) отображается на панели задач, что не здорово...
Как быть? Подскажите...


 
y-soft   (2003-08-26 09:10) [1]

Совсем необязательно, даже при вызове из Dll немодальных форм - работать будет ничем не хуже, только форму будет видно в панели задач...


 
KSergey   (2003-08-26 09:13) [2]

y-soft © (26.08.03 09:10)
Совсем необязательно, даже при вызове из Dll немодальных форм - работать будет ничем не хуже, только форму будет видно в панели задач...


Очень даже верно, вто только вот этого отображения на панели задач и хочется как раз избежать...


 
VAleksey   (2003-08-26 09:26) [3]

У тебя нет объекта Application?


 
Camus   (2003-08-26 09:34) [4]

> вот этого отображения на панели задач и хочется как раз
> избежать...

У форм в DLL заместите CreateParams, а в нем напишите:
inherited;
with Params do
ExStyle := ExStyle and not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW


 
Vlad   (2003-08-26 09:38) [5]

Не проще у формы поставить BorderStyle=bsToolWindow ?


 
KSergey   (2003-08-26 09:55) [6]

[3] VAleksey © (26.08.03 09:26)
У тебя нет объекта Application?


В DLL конечно же есть, но вот в вызывающем приложении - не факт. Пример: приложение на Access или самописанное без окон (и дверей ;).
Не, правда: вот что по задумке создателей VCL я должен запихивать в Application.Handle DLL-ки, если вызываю эту библиотеку не из дельфийского приложения? В хелпе мне не попалось такое, написано лишь, что зыпихать значение из Application.Handle хост-приложения. Типа кроме дельфи ничего нет ;)

[4] Camus © (26.08.03 09:34)
[5] Vlad © (26.08.03 09:38)

Хм, я попробую. Хоть проблемы это не решит, но скроет ее.
Поясню: боюсь, вылезет другая: присваивать что-то этому полю надо для того, чтобы при свертывании хост-приложения корректно обрабатывались формы, созданные в DLL...


 
KSergey   (2003-08-27 08:21) [7]

Неужели больше нет мыслей, люди?


 
y-soft   (2003-08-27 09:00) [8]

Можно добиться такого же эффекта, какой дает присвоение Application.Handle просто вызывая в OnCreate

SetWindowLong(Self.Handle, GWL_HWNDPARENT, ParentHWND);

Отличие от стандартной методики - влияет только на одну создаваемую форму, т.е. не вызовет непоняток при использовании Dll разными процессами...

Второе - где этот самый ParentHWND взять, если в хост-приложении нет Application? Application-то действительно может не быть, но главное окно, а значит и его HWND обычно есть (можно вообще передавать HWND любого окна, не обязательно главного). А раз язык позволяет работать с Dll, то значит и средства для получения этого HWND с большой вероятностью в нем присутствуют.

Ну а если нет, то смело можно передавать 0 - родителем станет Desktop...

Можно передавать ParentHWND как параметр в функцию создания окна, а можно и вычислить в Dll, используя тот факт, что всегда можно получить HProcess...


 
KSergey   (2003-08-28 09:46) [9]

> y-soft © (27.08.03 09:00) [8]

Не, не получается у меня пойти путем использования HProcess... Может еще подсказочку дадите: куда его приткнуть и где его взять ;)


 
www   (2003-08-28 10:03) [10]

вообще-о у акцессовских форм есть свойство hwnd -
You can use the hWnd property to determine the handle (a unique Long Integer value) assigned by Microsoft Windows to the current window. Read/write Long.
м.б. это решит проблему?


 
KSergey   (2003-08-28 10:57) [11]

[10] www (28.08.03 10:03)
вообще-о у акцессовских форм есть свойство hwnd -


Однако это вполне устроит.
Спасибо.



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

Форум: "Основная";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
9-24295
MASSACRE
2003-03-05 03:54
2003.09.08
Кубические сплайны Помогитееее.


3-24350
Алексей Петухов
2003-08-17 12:23
2003.09.08
Insufficient memory for this operation


14-24627
МАКСИК
2003-08-21 09:51
2003.09.08
КАК отучить собаку гавкать?


14-24646
SerVel
2003-08-21 18:33
2003.09.08
interrupt


3-24367
Salvator
2003-08-15 21:23
2003.09.08
Работа с SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский