Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать имя файла по handle окна? 
:(
    Опции темы
Voyager
Дата 3.2.2006, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 4
Всего: 18



GetWindowThreadProcessId(FindWindow('MyClass', nil);, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

В общем есть handle окна приложения, получаемый через FindWindow, есть ProcessId и т.д. Как узнать путь до ехе-файла/имя файла приложения?


PM   Вверх
_hunter
Дата 3.2.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



делаеш CreateToolhelp32Snapshot
потом Process32First / Process32Next и сравниваеш твой ProcessId с PROCESSENTRY32.th32ProcessID как найдеш -- смотри PROCESSENTRY32.szExeFile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Voyager
Дата 3.2.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 4
Всего: 18



Да, этот способ я знаю, он даст имя ехе. А вот как узнать расположение этого ехе, то есть путь до файла?
PM   Вверх
_hunter
Дата 3.2.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



он даст полный путь
Добавлено @ 13:12
+ сюда:
http://forum.vingrad.ru/index.php?showtopic=22908
глянь...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RA
Дата 3.2.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Цитата(_hunter @ 3.2.2006, 13:03 Найти цитируемый пост)

он даст полный путь


Как когда-то писал посол ....

Цитата

Смотри описание CreateToolhelp32Snapshot
Process32First / Process32Next
Там по поводу имени исполняемого файла сказано:Цитата
szExeFile
Pointer to a null-terminated string that specifies the name of the executable file for the process.
Windows 2000/XP:  The file name does not include the path.

Windows 95/98/Me:  The file name includes the path.
Т.е. получается наоборот - в 2k/XP имя .exe будет без пути...


Добавлено @ 15:11
однако не всё безнадёжно.
http://forum.vingrad.ru/index.php?showtopi...ost&p=74829
PM   Вверх
Girder
Дата 3.2.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(RAdmin @ 3.2.2006, 14:57 Найти цитируемый пост)

однако не всё безнадёжно.
Получаеш PID процесса по окну... после чего можеш получить и имя и путь, и параметры запуска http://forum.vingrad.ru/index.php?findpost=289762


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
RA
Дата 3.2.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Я не знаю правильно ли я был понят smile (я хотел сказать что лехкая переработка кода данного послом привидёт к нужному результату)
так что чтоб потом небыло недопониманий мне пришлось написать то что я имел в виду smile :

Код

uses Tlhelp32 
.....
var

    WindowName: Integer;
  ProcessId: Integer;
  
.......

procedure TForm1.Button1Click(Sender: TObject);
var
 ssh1, ssh2 : THandle;
 pe32 : TProcessEntry32;
 me32 : TModuleEntry32;


begin
  WindowName := FindWindow(nil, pChar(Edit1.text));

  GetWindowThreadProcessId(WindowName, @ProcessId);



         ssh1 := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
         pe32.dwSize := SizeOf(pe32);
         me32.dwSize := SizeOf(me32);

   if Process32First(ssh1, pe32) then
   repeat

       ssh2 := CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, pe32.th32ProcessID);
       if Module32First(ssh2, me32) then
       repeat

         if me32.th32ProcessID = ProcessID then
         Memo1.lines.add( me32.szExePath );

       until not Module32Next(ssh2, me32);
       CloseHandle(ssh2);


   until not Process32Next(ssh1, pe32);
      CloseHandle(HandleWindow);


end;





Получаем полный путь к процессу + все подключённые к ниму модули.

Это сообщение отредактировал(а) RAdmin - 3.2.2006, 20:11
PM   Вверх
Voyager
Дата 3.2.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 4
Всего: 18



Спасибо, разобрался (переделал немного вариант Girder'a):
Код

var
  GCL,DW,StrAddr,NumWriteRead:Cardinal;
  OFPCommandLineA:string='';
...
GetWindowThreadProcessId(FindWindow('MyClass', nil);, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
                                    If HandleWindow<>0 then
                                        begin
                                            GCL:=Cardinal(GetProcAddress(GetModuleHandle('kernel32.dll'),'GetCommandLineA'));
                                            if GCL<>0 then
                                                begin
                                                    if ReadProcessMemory(HandleWindow,Pointer(GCL+1),@DW,4,NumWriteRead)and(NumWriteRead=4)and
                                                    ReadProcessMemory(HandleWindow,Pointer(DW),@StrAddr,4,NumWriteRead)and(NumWriteRead=4) then
                                                        begin
                                                            SetString(OFPCommandLineA, nil, MAX_PATH);
                                                                if ReadProcessMemory(HandleWindow,Pointer(StrAddr),@OFPCommandLineA[1],Length(OFPCommandLineA),NumWriteRead) then
                                                                    SetLength(OFPCommandLineA,Pos(#0,OFPCommandLineA)-1)
                                                                else
                                                                    OFPCommandLineA:='';
                                                        end;
                                                end;
                                            CloseHandle(HandleWindow);
                                        end;

В OFPCommandLineA будет полный путь с параметрами.

Это сообщение отредактировал(а) Voyager - 3.2.2006, 21:34
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.