Главная страница
    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.097 c
15-1191797155
Альберт Мобайл
2007-10-08 02:45
2007.11.11
посоветуйте


2-1192347654
Vasiliy
2007-10-14 11:40
2007.11.11
InterBase. Попытка соединения с локальной БД в режиме Run-Time


15-1192012446
NiGGa
2007-10-10 14:34
2007.11.11
Delphi7 и .dfm


6-1173167422
dron9205
2007-03-06 10:50
2007.11.11
Передача информации через com-порт


15-1191242767
REA
2007-10-01 16:46
2007.11.11
Прорисовка компонента Explorer Search bar





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