Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Путь к программе


_Stalker_ ©   (2004-07-11 01:39:00) 

Как по хэндлу окна, узнать путь к проге


VMcL   (2004-07-13 11:49:00) [1]

>>Ertong ©   (13.07.04 00:09) [7]

Потому что GetModuleFileName() не умеет работать с другими процессами. А проверять, какая ОС, нужно потому, что в Win9x нет GetModuleFileNameEx().


_Stalker_   (2004-07-13 02:07:00) [2]


> Ertong ©  

У меня Delphi 5

Всем огромное спасибо за помощь, особенно DVM, за работающий исходник.


Ertong   (2004-07-13 00:09:00) [3]


>  [6] DVM ©   (12.07.04 23:35)

Может я чего не понимаю, но зачем спользовать GetModuleFileNameEx и проверять на какой системе сидиш, если можно просто использовать GetModuleFileName?


DVM   (2004-07-12 23:35:00) [4]

function _GetProcessFileNameByWindowHandle(Wnd: HWND): string;
var
 hProcess: THandle;
 PID: Cardinal;
 FileName: array [1..MAX_PATH] of char;
 PE: TProcessEntry32;
 Snap: Cardinal;
 OsVerInfo: TOSVersionInfo;
begin
 Result := '';
 GetWindowThreadProcessId(Wnd, @PID);
 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 if GetVersionEx(osVerInfo) then
   begin
     if OsVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
       begin
         ZeroMemory(@Filename[1], SizeOf(Filename));
         GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));
         Result := FileName;
       end
     else
       begin
         Snap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
         if Snap <> -1 then
           begin
             PE.dwSize:=SizeOf(PE);
             if Process32First(Snap, PE) then
               repeat
                 if PE.th32ProcessID = PID then Result := PE.szExeFile;
               until not Process32Next(Snap, PE);
           end;
       end;
   end;
 CloseHandle(hProcess);
end;


Ertong   (2004-07-12 23:32:00) [5]

Хм...
-cut-
function GetWindowThreadProcessId(hWnd: HWND; lpdwProcessId: Pointer): DWORD; external user32 name 'GetWindowThreadProcessId';
-cut-
А тебя какой Дельфи? У меня 7.

Интересно то, что у меня работает по-всякому:

GetWindowThreadProcessId( Handle ,PrID);
GetWindowThreadProcessId( Handle ,@PrID);
PrID:=GetWindowThreadProcessId( Handle ,nil);

Да, кстати, очепятка:
GetModuleFileName(hPr,FileName,sizeOf( FileName));

Есть на свете чудеса :)


_Stalker_   (2004-07-12 16:19:00) [6]

Выскакивает ошибка Access Violation, народ, поделитесь пожалуста работающими исходниками, очень надо :(


VMcL   (2004-07-12 15:29:00) [7]

1. Не GetModuleFileName, а GetModuleFileNameEx (NT only) - uses PsAPI.
2. Для Win9x - uses TlHelp32.


_Stalker_   (2004-07-12 15:09:00) [8]

Выдаёт ошибку несоответствия типов :(
PrID-точно cardinal ?


Ertong   (2004-07-11 13:10:00) [9]

var
 FileName:array[0..MAX_PATH] of char;
 PrID,HPr:cardinal;
begin
 GetWindowThreadProcessId( Хэндл окна,PrID);
 HPr:=OpenProcess(0,false,PrID);
 GetModuleFileName(hPr,FileName,sizeOf(a));
 CloseHandle(HPr);


Наверх

Титульная страница Поиск, карта сайта Написать письмо