![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как по узнать запускаемый файл приложения по его Hinstance?
vlv © (2002-09-03 11:06:00)???
Alx2 (2002-09-03 13:02:00) [1]>Bass1 (03.09.02 12:58)
Это уже проехали.
Человек спрашивает немного другое (vlv © (03.09.02 11:36))
Bass1 (2002-09-03 12:58:00) [2]function FileNameByInstance: string
var
lFileName: array[0..max_path] of char;
S: string;
begin
GetModuleFileName(HInstance, lFileName, SizeOf(lFileName));
S := lFileName;
Result := trim(S);
end;
HInstance есть у каждого процеса !!! будь то DLL или OCX. Если указать HInstance:=NULL то получите имя файла родительского процесса.
Alx2 (2002-09-03 12:34:00) [3]Иии так :)
Var Str : array [char] of char;
begin
GetWindowModuleFileName(Application.Handle,Str,sizeof(str));
Alx2 (2002-09-03 12:29:00) [4]>Alx2 © (03.09.02 12:25)
Нет, скорее всего не получится.
Но если приспичило получить искомое именно по hInstance, то IMHO придется-таки внедрятся в интересующий процесс и оттуда звать GetModuleFileName.
Старый Паскалист (2002-09-03 12:28:00) [5]HInstance/HModule суть адреса загрузки кода exe- и dll-модулей в адресном пространстве процесса.
Они, естественно, процессо-зависимы, и, более того, очень велика вероятность того, что в разных процессах они будут одинаковые.
2vlv © (03.09.02 11:57)
>> Виктор Щербаков
>Ты неправ.
>Хендлы действительны независимо от пространства.
>Это НЕ УКАЗАТЕЛИ.
Хэндлы окон действительно процессонезависимы.
А хендлы объектов ядра (Thread, Process, и т.д.) - зависимы.
Alx2 (2002-09-03 12:25:00) [6]>Я тоже думал, что HInstance и HModule имеет тот же смысл,
>однако вызов GetModuleFileName(Application.Handle) результата
>не дает
Сначала попробовать DuplicateHandle?
Виктор Щербаков (2002-09-03 12:16:00) [7]Eugene © (03.09.02 12:02)
Даже если в твоем коде исправить ошибки (результат вызовов функций теряется), то всё равно, работать он будет только для своего процесса. Что, вобщем-то очевидно.
Eugene (2002-09-03 12:02:00) [8]
Function FssGetFileName(Const Handle: HWND): String;
Var
A : Array [0..512] of Char;
begin
Result:="";
if (GetClassLong(Handle,GCL_HMODULE) = 0) then Exit;
if (GetModuleFileName(Res,A,SizeOf(A)) = 0) then Exit;
SetString(Result,A,Res);
end;
Виктор Щербаков (2002-09-03 12:00:00) [9]Начнем с того, что Application.Handle и HInstance - вещи совершенно разные. Application.Handle - Handle главного окна приложения. HInstance - адрес спроецированного в АП exe-шника.
По-этому естественно, что вызов GetModuleFileName(Application.Handle) не дал результата.
vlv (2002-09-03 11:57:00) [10]> Виктор Щербаков
Ты неправ.
Хендлы действительны независимо от пространства.
Это НЕ УКАЗАТЕЛИ.
Я тоже думал, что HInstance и HModule имеет тот же смысл,
однако вызов GetModuleFileName(Application.Handle) результата не дает
Виктор Щербаков (2002-09-03 11:53:00) [11]
> Только GetModuleFileName работает с HModule.
> А как мне его получить по handle окна приложения (Application.Handle)?
А зачем тебе HModule или HInstance чужого процесса? Ведь в адресном пространстве твоегопроцесса они не имеют смысла.
Виктор Щербаков (2002-09-03 11:39:00) [12]HInstance и HModule имеет тот же смысл - адрес модуля в АП процесса.
vlv (2002-09-03 11:36:00) [13]Спасибо.
Только GetModuleFileName работает с HModule.
А как мне его получить по handle окна приложения (Application.Handle)?
Виктор Щербаков (2002-09-03 11:16:00) [14]procedure TForm1.Button1Click(Sender: TObject);
var
P: PChar;
begin
GetMem(P, MAX_PATH);
try
GetModuleFileName(Hinstance, P, MAX_PATH);
Label1.Caption := P;
finally
Freemem(P, MAX_PATH);
end
end;
Ученик (2002-09-03 11:15:00) [15]Окуда его (Hinstance) взяли ?