Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
ВнизКак по узнать запускаемый файл приложения по его Hinstance? Найти похожие ветки
← →
vlv (2002-09-03 11:06) [0]???
← →
Ученик (2002-09-03 11:15) [1]Окуда его (Hinstance) взяли ?
← →
Виктор Щербаков (2002-09-03 11:16) [2]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;
← →
vlv (2002-09-03 11:36) [3]Спасибо.
Только GetModuleFileName работает с HModule.
А как мне его получить по handle окна приложения (Application.Handle)?
← →
Виктор Щербаков (2002-09-03 11:39) [4]HInstance и HModule имеет тот же смысл - адрес модуля в АП процесса.
← →
Виктор Щербаков (2002-09-03 11:53) [5]
> Только GetModuleFileName работает с HModule.
> А как мне его получить по handle окна приложения (Application.Handle)?
А зачем тебе HModule или HInstance чужого процесса? Ведь в адресном пространстве твоего процесса они не имеют смысла.
← →
vlv (2002-09-03 11:57) [6]> Виктор Щербаков
Ты неправ.
Хендлы действительны независимо от пространства.
Это НЕ УКАЗАТЕЛИ.
Я тоже думал, что HInstance и HModule имеет тот же смысл,
однако вызов GetModuleFileName(Application.Handle) результата не дает
← →
Виктор Щербаков (2002-09-03 12:00) [7]Начнем с того, что Application.Handle и HInstance - вещи совершенно разные. Application.Handle - Handle главного окна приложения. HInstance - адрес спроецированного в АП exe-шника.
По-этому естественно, что вызов GetModuleFileName(Application.Handle) не дал результата.
← →
Eugene (2002-09-03 12:02) [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:16) [9]Eugene © (03.09.02 12:02)
Даже если в твоем коде исправить ошибки (результат вызовов функций теряется), то всё равно, работать он будет только для своего процесса. Что, вобщем-то очевидно.
← →
Alx2 (2002-09-03 12:25) [10]>Я тоже думал, что HInstance и HModule имеет тот же смысл,
>однако вызов GetModuleFileName(Application.Handle) результата
>не дает
Сначала попробовать DuplicateHandle?
← →
Старый Паскалист (2002-09-03 12:28) [11]HInstance/HModule суть адреса загрузки кода exe- и dll-модулей в адресном пространстве процесса.
Они, естественно, процессо-зависимы, и, более того, очень велика вероятность того, что в разных процессах они будут одинаковые.
2vlv © (03.09.02 11:57)
>> Виктор Щербаков
>Ты неправ.
>Хендлы действительны независимо от пространства.
>Это НЕ УКАЗАТЕЛИ.
Хэндлы окон действительно процессонезависимы.
А хендлы объектов ядра (Thread, Process, и т.д.) - зависимы.
← →
Alx2 (2002-09-03 12:29) [12]>Alx2 © (03.09.02 12:25)
Нет, скорее всего не получится.
Но если приспичило получить искомое именно по hInstance, то IMHO придется-таки внедрятся в интересующий процесс и оттуда звать GetModuleFileName.
← →
Alx2 (2002-09-03 12:34) [13]Иии так :)
Var Str : array [char] of char;
begin
GetWindowModuleFileName(Application.Handle,Str,sizeof(str));
← →
Bass1 (2002-09-03 12:58) [14]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 13:02) [15]>Bass1 (03.09.02 12:58)
Это уже проехали.
Человек спрашивает немного другое (vlv © (03.09.02 11:36))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c