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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2009, 19:21   #1
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
Восклицание Как узнать путь к файлу по хэндлу?

Вопрос находиться в самой теме више ^
W0LF вне форума Ответить с цитированием
Старый 16.10.2009, 20:06   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Раз
Код:
Uses
   TLHelp32;
Function HandleToFullPath(H: HWND): String;
Var
Pid:Cardinal;
M: TModuleEntry32;
HSnapshot: THandle;
Begin
Result:='';
GetWindowThreadProcessId(H,@Pid);
HSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);
If HSnapshot=-1 Then
Exit;
M.DwSize:=SizeOf(TModuleEntry32);
If Module32First(HSnapshot,M) Then
Result:=M.SzExePath;
CloseHandle(HSnapshot);
End;
Procedure TForm1.Button1Click(Sender: TObject);
Var
H: HWND;
Begin
H:=FindWindow(Nil,'Program manager');
Label1.Caption:=HandleToFullPath(H);
End;
Два
Код:
var
  GCL,DW,StrAddr,NumWriteRead:Cardinal;
  OFPCommandLineA:string;
  ProcessId, HandleWindow : DWord;
begin
GetWindowThreadProcessId(FindWindow(nil, 'Unit1.pas'), @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;
  ShowMessage(OFPCommandLineA);
Три
(укажи хендл чужого окна)
Код:
GetModuleName(GetClassLong(handle,GCL_HMODULE));
Все просто как Раз-Два-Три.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось rpy3uH; 16.10.2009 в 20:26.
Alex Cones вне форума Ответить с цитированием
Старый 16.10.2009, 20:25   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Если необходимо узнать путь к файлу по хендлу файла (который получен через CreateFile), то это можно сделать через пресловутый файловый мэпинг.
CreateFileMapping
MapViewOfFile
GetMappedFileName
MSDN всё знает! вот ссылка с кодом на С++:
http://msdn.microsoft.com/en-us/libr...89(VS.85).aspx
Если в голове есть в наличии мозги, то на Delphi перевести будет не трудно.

Последний раз редактировалось rpy3uH; 16.10.2009 в 20:28.
rpy3uH вне форума Ответить с цитированием
Старый 16.10.2009, 20:40   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

дык, четыре
http://www.programmersforum.ru/showp...41&postcount=2
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.10.2009, 22:17   #5
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Вот и пять =) :
Код:
function AddressEXE(window:hwnd):string;
var
  ProcessID : Cardinal;
  ProcessHandle : Cardinal;
  ModuleHandles : array[0..256] of DWORD;
  nBytes : Cardinal;
  ModuleName :array[0..259] of Char;
begin
  GetWindowThreadProcessId(Window, @ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
  EnumProcessModules(ProcessHandle, @ModuleHandles, 256 * 4, nBytes);
  GetModuleFileNameEx(ProcessHandle, ModuleHandles[0], ModuleName, 256);
  result := string(ModuleName);
end;
W0LF вне форума Ответить с цитированием
Старый 16.10.2009, 22:26   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

даешь еще!
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.01.2017, 13:54   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,792
По умолчанию

Wolf, спасибо, помогло. работает не только для хэндла формы, но и для любго элемента на этой форме.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить путь к файлу Manya Общие вопросы Delphi 5 22.05.2012 16:12
Путь к файлу по хэндлу окна Veiron Общие вопросы Delphi 10 22.05.2009 20:47
Как найти путь к файлу? Gawwws Microsoft Office Excel 6 05.12.2008 14:01
Как узнать полный путь к *.ехе файлу SeЯgey Помощь студентам 3 27.05.2008 09:46
Как вытащить путь к файлу UnD)eaD)Snake Общие вопросы Delphi 13 20.08.2007 22:09