![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Путь к выполняемому приложению [D6, Win2k, WinXP]
Tanya © (2003-10-23 13:15:00)
Мастера помогите. Как получить путь к выполняемому приложению ? Типа S:=Application.ExeName; Только не через объект Application. Если можно киньте примерчик.
Polevi (2003-10-23 13:40:00) [1]
ParamStr(0)
KosilkA (2003-10-23 13:37:00) [2]
uses ...,PsApi,....;
.....................
function ProcessByName:string;
var
hInstLib: THANDLE;
hInstLib2: THANDLE;
lpdwPIDs: PWordArray;
dwSize, dwSize2, dwIndex: DWORD;
hMod: HMODULE;
hProcess: THANDLE;
szFileName: array [0..MAX_PATH] of char;
lpfEnumProcesses: TEnumProcesses;
lpfEnumProcessModules: TEnumProcessModules;
lpfGetModuleFileNameEx: TGetModuleFileNameEx;
begin
hInstLib := LoadLibraryA("PSAPI.DLL");
if hInstLib = 0 then Exit;
hInstLib2 := LoadLibraryA("VDMDBG.DLL");
if hInstLib2 = 0 then Exit;
lpfEnumProcesses := GetProcAddress(hInstLib,"EnumProcesses");
lpfEnumProcessModules := GetProcAddress(hInstLib,"EnumProcessModules");
lpfGetModuleFileNameEx := GetProcAddress(hInstLib,"GetModuleFileNameExA");
if (Integer(@lpfEnumProcesses) = 0) or (Integer(@lpfEnumProcessModules) = 0) or
(Integer(@lpfGetModuleFileNameEx) = 0) then
begin
FreeLibrary(hInstLib);
FreeLibrary(hInstLib2);
Exit;
end;
dwSize2 := 256 * SizeOf(DWORD);
lpdwPIDs := nil;
repeat
if lpdwPIDs <> Nil then
begin
HeapFree(GetProcessHeap(),0,lpdwPIDs);
dwSize2 := dwSize2 * 2 ;
end;
lpdwPIDs := HeapAlloc(GetProcessHeap(),0,dwSize2);
if lpdwPIDs = Nil then
begin
FreeLibrary( hInstLib ) ;
FreeLibrary( hInstLib2 ) ;
Exit;
end;
if not lpfEnumProcesses(Pointer(lpdwPIDs),dwSize2,dwSize) then
begin
HeapFree(GetProcessHeap(),0,lpdwPIDs);
FreeLibrary( hInstLib ) ;
FreeLibrary( hInstLib2 ) ;
Exit;
end;
until(dwSize <> dwSize2);
dwIndex := 0;
while dwIndex < dwSize do
begin
szFileName[0] := #0;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ,FALSE,lpdwPIDs[dwIndex]);
if hProcess <> 0 then
begin
if lpfEnumProcessModules(hProcess,@hMod,sizeof(hMod),dwSize2) then
begin
if lpfGetModuleFileNameEx(hProcess,hMod,szFileName,
sizeof(szFileName)) = 0 then
szFileName[0] := #0;
end;
CloseHandle(hProcess);
if szfilename<>""then result:=result+szFileName+#13#10;
end;
Inc(dwIndex);
end;
HeapFree(GetProcessHeap(),0,lpdwPIDs);
FreeLibrary(hInstLib2);
FreeLibrary( hInstLib ) ;
end;