| | | | |
Эксплуатационные 'режимы' использования динамически компонуемых библиотек | Полный текст материала
Цитата или краткий комментарий: «... В данной статье речь пойдёт, не о том как писать dll, а о том как их можно использовать. Регистрация dll в системе. Удаление программы 'во время исполнения'. Размещение модальных форм в dll. Ловушки в dll и так далее.
...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 5 | 62.5% | | | | Ничего особенно нового и интересного | [2] | 1 | 12.5% | | | | Написано неверно (обязательно укажите почему) | [3] | 2 | 25% | | Всего проголосовали: 8 | | | Все понятно, материал читается легко | [1] | 6 | 100% | | | | Есть неясности в изложении | [2] | 0 | 0% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 6 |
[Использование и создание DLL]
Отслеживать это обсуждение
Всего сообщений: 1130-01-2003 09:44Особенно мне нравится, как расписано про Grid-ы. С примерчиком и т.п. :) |
|
22-12-2001 13:51>> Алексей Павлов
Юрий Зотов упомянул в своём сообщении одного человека (думаю, что программиста) - Алексея Петрова, который на мой вопрос http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1008831628&n=0
прислал совершенно потрясающий пример правильной организации работы с MDI-child формами, расположенными в DLL, который можно скачать по адресу - http://www.ubb.adm.yar.ru/downloads/public/develop/delphi/mdi-BPL.zip
Думаю, что те разработчики, которые созрели до по-настоящему серьезной работы с DLL, обязательно должны ознакомиться с этим примером.
Полагаю, также, что есть созревшая необходимость обратиться к Алексею Петрову с просьбой стать на некоторое время главным редактором небольшого колллектива авторов и написать стьтью по данной проблематике, охватывающую все стороны работы с DLL. |
|
21-12-2001 20:06Справедливости ради должен сказать, что, даже прекрасно зная об изолированности адресных пространств процессов в Win32 и понимая особенности работы глобальных хуков, я до недавнего времени и сам наступал на те же самые грабли. То есть, строил глобальные хуки по той же самой схеме, которая приведена в статье. Объяснить это можно только моим недостаточно вдумчивым подходом к данному вопросу.
Ошибка эта неожиданно выяснилась в беседе с Алексеем Петровым (за что ему большое спасибо!). К сожалению, до этого я уже успел ответить на немалое количество писем с вопросами по глобальным хукам и в качестве примера приводил в ответах ту же самую ошибочную схему. Поэтому, пользуясь случаем, еще раз приношу извинения своим респондентам, которых я невольно ввел в заблуждение и привожу ссылку на пример правильно построенного глобального хука, который был написан мною в качестве некоей компенсации:
http://delphi.mastak.com/cgi-bin/forum.pl?look=1&id=992616736&n=2
|
|
21-12-2001 15:30Юрий Зотов абсолютно прав.
Как программист более опытный, он указал мне на ошибку, которая действительно является достаточно типичной :(
За это большое ему спасибо.
Оправдываться не стану - виноват... будем исправляться.
>> ilysha: насчёт дочерних форм я честно написал - мне эта тема пока просто не интерестна и осветил я её в меру своей компетенции в данной области.
Я вовсе не претендую на всезнание, дело в том, что меня попросили написать на заданную тему, публиковать лично я её не собирался.
Если у вас есть какие-то вопросы, которые я не осветил, но на которые хотелось бы получить ответ - можете задать их по почте и в меру своих сил попробую вам помочь.
Так что прошу прощения у всех, кого ввёл в заблуждение своими примерами. Просто хотел поделиться опытом.
Спасибо всем за комментарии. |
|
21-12-2001 09:56То, что создал Алексей Павлов, в научном мире называет эклектикой, то есть сборником самых лучших идей. Но увы, в научном мире к таким работам относятся с подозрнием, так как есть сомнения - а автор сам насколько хорошо разбирается в данной проблематике.
Почему я так считаю? Автор, например, вообще не затрагивает такой сложный вопрос для разрабочиков - это размещение и управление дочерними окнами в DLL.
Мое мнение - статья не отвечает на большинство вопросов, задаваемых в различных форумах, в том числе и в DelphiKindom. Может быть рекомендована только исключительно новичкам.
Я прошу Алексея не обижаться на мое мнение, и признаю, что раздел 'Ловушки в dll.' очень интересен. |
|
20-12-2001 18:46> Несмотря на ошибки, полезная и нужная статья.
Полностью согласен. И от себя добавлю - очень хорошо написана. |
|
20-12-2001 14:58Несмотря на ошибки, полезная и нужная статья.
Остается пожелать автору тщательнее тестировать код.
А также желательно проверять работу под NT/2000. Или сообщать,
что for Win9x only - по объективным причинам, а не потому, что
не проверено. |
|
20-12-2001 13:01Заочно знаком с автором статьи по форумам и отношусь к нему с огромным уважением, но в данном случае должен сказать, что, к сожалению, в статье допущена неявная (а потому очень распространенная) ошибка. Изложенная методика работы с ловушками годится для локальных HOOK"ов, но совершенно не подходит для глобальных (о которых и идет речь в статье, судя по параметрам вызова SetWindowsHookEx).
Дело в том, что переменная SysHook получит правильное значение лишь в контексте того процесса, который вызвал SetWindowsHookEx. В остальных же она останется нулем и поэтому для них правильный вызов CallNextHookEx окажется невозможным. Таким образом, предыдущая ловушка (если она была) для всех процессов, кроме одного, оказывается фактически отключенной, что может привести к нежелательным последствиям.
Вывод - переменная SysHook должна находиться в области памяти, доступной ВСЕМ процессам. Скажем, в memory mapped file. |
|
20-12-2001 12:35Я думаю:
BOOL TerminateProcess(
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);
|
|
20-12-2001 11:58> Дмитрий:
Вы совершенно правы насчёт того, что приложение может не успеть выгрузиться, но для этого там и стоит sleep ;)
Но предложенный мною способ всего лишь вариация на тему и ничего больше...
А что Вы подразумеваете под жёстким убитием ? |
|
20-12-2001 08:18Удаление программы 'во время исполнения'.
Пока удаляемый программа еще загружена, удалить ее будет невозможно.
Вы там вызываете Close, что приводит к выгрузке приложения.
Теперь следует погадать на кофейной гуще - успеет ли приложнение выгрузится ДО ТОГО, как rundll выполнит удаление?
Если приложение маленькое (во всяком случая, выгружается быстро),
вероятность этого близка к 1. Но, как правило, это не так.
Нормальный выход из Delphi на PII длится около минуты (у меня, при 128Mb - просто загруженный проект в него достаточно большой)
Предложенный метод хорош только для приложений типа 'калькулятор'.
Гораздо лучше использовать предварительное 'жесткое' убитие процесса (все равно файл будет удален, зачем позволять ему сохранять пользовательские данные?) |
|
|
|