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

Вниз

Хендл формы из 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.07 c
2-1192618151
sydenis
2007-10-17 14:49
2007.11.11
rasdial


15-1192060844
ЮЮ
2007-10-11 04:00
2007.11.11
Запись в реестр из reg-файла


15-1191328457
Prohodil Mimo
2007-10-02 16:34
2007.11.11
Delphi + Unicode на Win98, как использовать unicows.dll


2-1192455837
фыва
2007-10-15 17:43
2007.11.11
Вставка в мемо


2-1193035306
temp_and_test
2007-10-22 10:41
2007.11.11
Какой объект вызывает ошибку Access Violation?





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