Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Хендл формы из dll   Найти похожие ветки 

 
Dmitry___   (2007-05-04 22:25) [0]

Привет. Проблема такая. Есть dll, не моя, в ней форма. Из dll экспортируется только функция, создающая окно. Параметров функции является хендл моего окна, в результате чего окошко из dll встраивается в моё окно через SetParent. Тут всё нормально. Но! Библиотека ничего не сообщает о хендле создаваемой и встраиваемой формы, а также не предоставляет никаких средств для закрытия этой формы. Это не есть гуд.
Вопрос: как найти хендл формы, присоединённой к моему окну через SetParent, чтобы потом закрыть её?
Помогите, кто сколько сможет :)))


 
Dmitry___   (2007-05-05 15:56) [1]

Неужели мне никто не поможет?! Пойду повешусь.

Да здравствует мыло душистое и верёвка пушистая...


 
Зюзя   (2007-05-05 21:42) [2]

PostMessage(Handle, CM_RELEASE, 0, 0);

P.S. А вообще, ты, похоже, путаешь форму и окно.


 
Dmitry___   (2007-05-05 23:16) [3]


> PostMessage(Handle, CM_RELEASE, 0, 0);

Handle чего именно? Не того ли, что я и хочу найти?


 
Leonid Troyanovsky ©   (2007-05-06 10:29) [4]


> Dmitry___   (04.05.07 22:25)  

> Вопрос: как найти хендл формы, присоединённой к моему окну
> через SetParent, чтобы потом закрыть её?

Т.е., WM_CHANGEUISTATE and WM_UPDATEUISTATE никто не озаботился?
Тогда, видимо, путем FindWindowEx того класса.

А еще лучше - в печь ее.

--
Regards, LVT.


 
Dmitry___   (2007-05-06 11:19) [5]

Т.е. нет никаких способов узнать хендл вызванной формы? А как насчёт хуков и тому подобных извращений? Мне даже это пошло бы...


 
GrayFace ©   (2007-05-07 14:12) [6]

Можно EnumChildWindows. В обработчике смотри GetWindowLong(GWL_HINSTANCE) и сравнивай с dll.


 
Novice   (2007-05-08 10:03) [7]

Во избежание возникновения похожих тем впишу свой вопрос в эту:
Есть у нас в конторе некоторое приложение (не нами написанное). Это приложение имеет дурную привычку при завершении своей работы оставлять в памяти гору 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 ?


 
begin...end ©   (2007-05-08 10:38) [8]

> Novice   (08.05.07 10:03) [7]

> написал простенькую функция для их убийства после завершения
> работы

И как? Работает?

> Меня интересует, возможно ли, имея некоторую информацию
> о программе (PId, хендл главного окна) получить список всех
> используемых ею DLL ?

Возможно. PId -> OpenProcess -> EnumProcessModules.


 
Novice   (2007-05-08 10:51) [9]

>>И как? Работает?
Да, вполне. Если знаешь имя DLL, и она действительно загружена в память, то да, убъет.

>>Возможно. PId -> OpenProcess -> EnumProcessModules.
Премного благодарен.


 
Leonid Troyanovsky ©   (2007-05-08 10:53) [10]


> 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 11:27) [11]

>>В чьей памяти?
Я пока еще не очень разбираюсь в этой области и точно ответить не могу... Но факт есть - после выгрузки приложения DLL остается в памяти и, зная ее имя, я могу получить хендл библиотеки и после вызвать оттуда процедуру/функцию. Как оно так - я не знаю. может, приложение на самом деле никуда не выгружается, может, ошибка в этом приложении. просто есть факт. и мне нужно его устранить, так как этих библиотек около десятка, и весят они по 4-5 метров.


 
Leonid Troyanovsky ©   (2007-05-08 12:01) [12]


> Novice   (08.05.07 11:27) [11]

> >>В чьей памяти?
> Я пока еще не очень разбираюсь в этой области и точно ответить
> не могу... Но факт есть - после выгрузки приложения DLL
> остается в памяти и, зная ее имя, я могу получить хендл
> библиотеки и после вызвать оттуда процедуру/функцию.

Как ты получаешь хендл по имени?
И в какой памяти ты должен знать, если уж это факт.

> просто есть факт.

Давай сюда только факт, без домыслов.

--
Regards, LVT.



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

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
4-1177781077
delete_file
2007-04-28 21:24
2007.11.11
Удаление файла занятого другим процессом


3-1183366710
Игорь Шевченко
2007-07-02 12:58
2007.11.11
Кто и как передает сообщения об ошибках при работе в оракле ?


1-1187790505
andreoman
2007-08-22 17:48
2007.11.11
проблема с расспознование Handle при закрытии формы


15-1191690459
mike-d
2007-10-06 21:07
2007.11.11
easy - с Днем рождения!


15-1191838594
homm
2007-10-08 14:16
2007.11.11
Нужен драйвер прямого доступа к COM порту