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

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

Как по узнать запускаемый файл приложения по его 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) взяли ?


Наверх

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