Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2016, 19:45   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию доступ к 64-битному процессу из 32-битной программы

Имеется функция, которая по хэндлу окна возвращает путь программы, которой оно принадлежит. Так вот, функция работает только с 32-битными процессами. Как заставить работать ее также и с 64-bit? Перекомпилировать проект под x64 не вариант (
Или может есть аналогичный способ получить путь по хэндлу?

Код:
uses psapi;
...

function GetAppPath(wnd: HWND): string;
var
 ProcId: DWord;
 Hndl: THandle;
 FName: string;
begin
 GetWindowThreadProcessId(wnd, @ProcId);
 Hndl:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, ProcId);
 SetLength(FName, MAX_PATH);
 if GetModuleFileNameEx (Hndl, 0, PChar(FName), MAX_PATH) > 0
 then
 begin
  SetLength(FName,StrLen(PChar(FName)));
  Result:= FName;
 end
 else Result:= 'n / a';
end;


...
var
 Wnd: HWND;
begin
  Wnd:= GetForegroundWindow();
  showmessage(GetAppPath(Wnd));
end
...
garuna вне форума Ответить с цитированием
Старый 13.01.2016, 20:18   #2
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
которая по хэндлу окна возвращает путь программы,
Это вы имеете в виду ?
Код:
  Label6.Caption := ExtractFilePath(Application.ExeName);

Последний раз редактировалось xxbesoxx; 13.01.2016 в 20:25.
xxbesoxx вне форума Ответить с цитированием
Старый 13.01.2016, 20:22   #3
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Код:
  Label6.Caption := ExtractFilePath(Application.ExeName);
Не то, мне чужой программы путь нужен, а не своей.
garuna вне форума Ответить с цитированием
Старый 13.01.2016, 21:36   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

попробуй, для начала, вместо GetModuleFileNameEx() поюзать QueryFullProcessImageName().

поставь брейк на GetWindowThreadProcessId(wnd, @ProcId); и посмотри, попадает ли валидный PID в переменную ProcId.
Ибо у меня в 32-битном приложении корректно отрабатывает вот такой кусок:
Код:
 ProcessHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);

  if ProcessHandle <> 0
    then try
           if GetModuleFileNameEx(ProcessHandle, 0, buffer, MAX_PATH) <> 0
             then Result:= buffer
             else DoError();
         finally
           CloseHandle(ProcessHandle);
         end;
то есть exe-шники от х64-приложений этот код тоже корректно возвращает.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось Аватар; 18.01.2016 в 19:42.
min@y™ вне форума Ответить с цитированием
Старый 18.01.2016, 17:52   #5
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
поставь брейк на GetWindowThreadProcessId(wnd, @ProcId); и посмотри, попадает ли валидный PID в переменную ProcId.
Ибо у меня в 32-битном приложении корректно отрабатывает вот такой кусок:
Код:
 ProcessHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);

  if ProcessHandle <> 0
    then try
           if GetModuleFileNameEx(ProcessHandle, 0, buffer, MAX_PATH) <> 0
             then Result:= buffer
             else DoError();
         finally
           CloseHandle(ProcessHandle);
         end;
то есть exe-шники от х64-приложений этот код тоже корректно возвращает.

Под рукой сейчас нет x64-версии ОС, не могу проверить. Но вроде я по всякому пробовал, не получалось. В итоге проблему решил через GetProcessImageFileName, которая корректно отрабатывает как с x32 так и с x64
garuna вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к модальному окну Делфи программы из моей на c# vik24rus C# (си шарп) 3 05.01.2015 11:50
Программирование на 64 битной OS CrashOveride Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 29.04.2014 12:47
Доступ к процессу )Игнат( Общие вопросы Delphi 1 01.07.2011 17:22
Доступ к памяти другой программы BaronTreep Win Api 10 31.05.2009 07:16