![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хендл формы из dll [D7, WinXP]
Dmitry___ © (2007-05-04 22:25:00)Привет. Проблема такая. Есть dll, не моя, в ней форма. Из dll экспортируется только функция, создающая окно. Параметров функции является хендл моего окна, в результате чего окошко из dll встраивается в моё окно через SetParent. Тут всё нормально. Но! Библиотека ничего не сообщает о хендле создаваемой и встраиваемой формы, а также не предоставляет никаких средств для закрытия этой формы. Это не есть гуд.
Вопрос: как найти хендл формы, присоединённой к моему окну через SetParent, чтобы потом закрыть её?
Помогите, кто сколько сможет :)))
Leonid Troyanovsky (2007-05-08 12:01:00) [1]
> Novice (08.05.07 11:27) [11]
> >>В чьей памяти?
> Я пока еще не очень разбираюсь в этой области и точно ответить
> не могу... Но факт есть - после выгрузки приложения DLL
> остается в памяти и, зная ее имя, я могу получить хендл
> библиотеки и после вызвать оттуда процедуру/функцию.
Как ты получаешь хендл по имени?
И в какой памяти ты должен знать, если уж это факт.
> просто есть факт.
Давай сюда только факт, без домыслов.
--
Regards, LVT.
Novice (2007-05-08 11:27:00) [2]>>В чьей памяти?
Я пока еще не очень разбираюсь в этой области и точно ответить не могу... Но факт есть - после выгрузки приложения DLL остается в памяти и, зная ее имя, я могу получить хендл библиотеки и после вызвать оттуда процедуру/функцию. Как оно так - я не знаю. может, приложение на самом деле никуда не выгружается, может, ошибка в этом приложении. просто есть факт. и мне нужно его устранить, так как этих библиотек около десятка, и весят они по 4-5 метров.
Leonid Troyanovsky (2007-05-08 10:53:00) [3]
> Novice (08.05.07 10:03) [7]
> Это приложение имеет дурную привычку при завершении своей
> работы оставлять в памяти гору DLL.
В чьей памяти?
> о программе (PId, хендл главного окна) получить список всех
> используемых ею DLL ?
http://groups.google.com/group/fido7.ru.delphi/msg/3c007cf3da66f53b
--
Regards, LVT.
Novice (2007-05-08 10:51:00) [4]>>И как? Работает?
Да, вполне. Если знаешь имя DLL, и она действительно загружена в память, то да, убъет.
>>Возможно. PId -> OpenProcess -> EnumProcessModules.
Премного благодарен.
begin...end (2007-05-08 10:38:00) [5]> Novice (08.05.07 10:03) [7]
> написал простенькую функция для их убийства после завершения
> работы
И как? Работает?
> Меня интересует, возможно ли, имея некоторую информацию
> о программе (PId, хендл главного окна) получить список всех
> используемых ею DLL ?
Возможно. PId -> OpenProcess -> EnumProcessModules.
Novice (2007-05-08 10:03:00) [6]Во избежание возникновения похожих тем впишу свой вопрос в эту:
Есть у нас в конторе некоторое приложение (не нами написанное). Это приложение имеет дурную привычку при завершении своей работы оставлять в памяти гору DLL. Проследив за работой программы, я определил, какие DLL она использует и написал простенькую функция для их убийства после завершения работы:
procedure TDLLKiller.KillItClick(Sender: TObject);
var DLLhandle: THandle;
Name: array[0..10] of char;
FoundDLL: Boolean;
begin
StrPCopy(aName, ListBox1.Items.Strings[ListBox1.ItemIndex]);
FoundDLL := false;
repeat
DLLhandle := GetModuleHandle(Name);
if DLLhandle = 0 then
break;
FoundDLL := true;
FreeLibrary(DLLhandle);
until false;
if FoundDLL then begin
MessageDlg('Killed', mtInformation, [mbOk], 0);
ListBox1.DeleteSelected;
end
else begin
MessageDlg('DLL не существует', mtInformation, [mbOk], 0);
ListBox1.DeleteSelected;
end;
end;
Меня интересует, возможно ли, имея некоторую информацию о программе (PId, хендл главного окна) получить список всех используемых ею DLL ?
GrayFace (2007-05-07 14:12:00) [7]Можно EnumChildWindows. В обработчике смотри GetWindowLong(GWL_HINSTANCE) и сравнивай с dll.
Dmitry___ (2007-05-06 11:19:00) [8]Т.е. нет никаких способов узнать хендл вызванной формы? А как насчёт хуков и тому подобных извращений? Мне даже это пошло бы...
Leonid Troyanovsky (2007-05-06 10:29:00) [9]
> Dmitry___ (04.05.07 22:25)
> Вопрос: как найти хендл формы, присоединённой к моему окну
> через SetParent, чтобы потом закрыть её?
Т.е., WM_CHANGEUISTATE and WM_UPDATEUISTATE никто не озаботился?
Тогда, видимо, путем FindWindowEx того класса.
А еще лучше - в печь ее.
--
Regards, LVT.
Dmitry___ (2007-05-05 23:16:00) [10]
> PostMessage(Handle, CM_RELEASE, 0, 0);
Handle чего именно? Не того ли, что я и хочу найти?
Зюзя (2007-05-05 21:42:00) [11]PostMessage(Handle, CM_RELEASE, 0, 0);
P.S. А вообще, ты, похоже, путаешь форму и окно.
Dmitry___ (2007-05-05 15:56:00) [12]Неужели мне никто не поможет?! Пойду повешусь.
Да здравствует мыло душистое и верёвка пушистая...