![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определить директорию запускаемого файла [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Windows © (2006-11-15 20:45:00)Как программе определить директорию каждого запускаемого пользователем файла в системе?
Windows (2006-11-17 18:41:00) [1]Ну с ехе все понятно, а если файл типа тхт, его уже открывает блокнот по умолчанию, следовательно директория будет не та.
> А чем же мытут занимаемся, как не тратим свое время, отвечая
> на ВАШИ вапросы, включая сваи телепатические шлёмы шобы
> понять , а шо ВЫ на самом деле хотели спросить и т.д.
>
> З,Ы, сори, но наболело.
Интересно, что значит тогда вот это
"Так он же Windows. Ему и карты в руки :-)"
Ответы на НАШИ вопросы в таком стиле?:/
BiN (2006-11-16 16:31:00) [2]
> Игорь Шевченко © (16.11.06 15:51) [8]
Для "каждого запускаемого пользователем файла" у него будет слишком много экземпляров деббугера - csrss загнется.
Elen (2006-11-16 16:24:00) [3]
> Windows
Вот Из Delphi world Forever :
unit Unit1;
interface
uses tlhelp32, psapi,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function RunningProcessesList(List: TStrings; FullPath: Boolean): Boolean;
function IsWinXP: Boolean;
begin
Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and
(Win32MajorVersion = 5) and (Win32MinorVersion = 1);
end;
function IsWin2k: Boolean;
begin
Result := (Win32MajorVersion >= 5) and
(Win32Platform = VER_PLATFORM_WIN32_NT);
end;
function IsWinNT4: Boolean;
begin
Result := Win32Platform = VER_PLATFORM_WIN32_NT;
Result := Result and (Win32MajorVersion = 4);
end;
function IsWin3X: Boolean;
begin
Result := Win32Platform = VER_PLATFORM_WIN32_NT;
Result := Result and (Win32MajorVersion = 3) and
((Win32MinorVersion = 1) or (Win32MinorVersion = 5) or
(Win32MinorVersion = 51));
end;
function ProcessFileName(PID: DWORD): string;
var
Handle: THandle;
begin
Result := '';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
if Handle <> 0 then
try
SetLength(Result, MAX_PATH);
if FullPath then
begin
if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '';
end
else
begin
if GetModuleBaseNameA(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '';
end;
finally
CloseHandle(Handle);
end;
end;
function BuildListTH: Boolean;
var
SnapProcHandle: THandle;
ProcEntry: TProcessEntry32;
NextProc: Boolean;
FileName: string;
begin
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Result := (SnapProcHandle <> INVALID_HANDLE_VALUE);
if Result then
try
ProcEntry.dwSize := SizeOf(ProcEntry);
NextProc := Process32First(SnapProcHandle, ProcEntry);
while NextProc do
begin
if ProcEntry.th32ProcessID = 0 then
begin
// PID 0 is always the "System Idle Process" but this name cannot be
// retrieved from the system and has to be fabricated.
FileName := 'RsSystemIdleProcess';
end
else
begin
if IsWin2k or IsWinXP then
begin
FileName := ProcessFileName(ProcEntry.th32ProcessID);
if FileName = '' then
FileName := ProcEntry.szExeFile;
end
else
begin
FileName := ProcEntry.szExeFile;
if not FullPath then
FileName := ExtractFileName(FileName);
end;
end;
List.AddObject(FileName, Pointer(ProcEntry.th32ProcessID));
NextProc := Process32Next(SnapProcHandle, ProcEntry);
end;
finally
CloseHandle(SnapProcHandle);
end;
end;
function BuildListPS: Boolean;
var
PIDs: array [0..1024] of DWORD;
Needed: DWORD;
I: Integer;
FileName: string;
begin
Result := EnumProcesses(@PIDs, SizeOf(PIDs), Needed);
if Result then
begin
for I := 0 to (Needed div SizeOf(DWORD)) - 1 do
begin
case PIDs[I] of
0:
// PID 0 is always the "System Idle Process" but this name cannot be
// retrieved from the system and has to be fabricated.
FileName := 'RsSystemIdleProcess';
2:
// On NT 4 PID 2 is the "System Process" but this name cannot be
// retrieved from the system and has to be fabricated.
if IsWinNT4 then
FileName := 'RsSystemProcess'
else
FileName := ProcessFileName(PIDs[I]);
8:
// On Win2K PID 8 is the "System Process" but this name cannot be
// retrieved from the system and has to be fabricated.
if IsWin2k or IsWinXP then
FileName := 'RsSystemProcess'
else
FileName := ProcessFileName(PIDs[I]);
else
FileName := ProcessFileName(PIDs[I]);
end;
if FileName <> '' then
List.AddObject(FileName, Pointer(PIDs[I]));
end;
end;
end;
begin
if IsWin3X or IsWinNT4 then
Result := BuildListPS
else
Result := BuildListTH;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RunningProcessesList(ListBox1.Items, true);
end;
end.
Разбирайся...
Elen (2006-11-16 15:51:00) [4]
> Windows
Некоторые кстати используют FindFistr...FindNext для получения всего имени
Игорь Шевченко (2006-11-16 15:51:00) [5]Windows © (16.11.06 15:28) [4]
> Вот и я не знаю, поэтому и спрашиваю, может можно как нибудь
> отслеживат запуск файлов, ну скажем *.ехе...
С помощью указания отладчика в реестре, например.
В HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Отладчиком может быть твоя программа.
> Не люблю, когда люди попусту тратят свое время, к тому же,
> тратя время других понапрасну...
> ничего не можете сказать по данному вопросу, зачем вообще
> влезать в дискуссию?
Терпи. Тебя сюда тоже не звали.
Array (2006-11-16 15:42:00) [6]Вам отслеживать запускаемые процесы, проверять пути к файлу и если exe то вуаля...
> Не люблю, когда люди попусту тратят свое время
А чем же мытут занимаемся, как не тратим свое время, отвечая на ВАШИ вапросы, включая сваи телепатические шлёмы шобы понять , а шо ВЫ на самом деле хотели спросить и т.д.
З,Ы, сори, но наболело....
Плохиш (2006-11-16 15:38:00) [7]А я знаю, надо хук поставить. Вот! :-)
Windows (2006-11-16 15:28:00) [8]Rouse_ © (15.11.06 21:31) [1]
Вот и я не знаю, поэтому и спрашиваю, может можно как нибудь отслеживат запуск файлов, ну скажем *.ехе...
Германн © (16.11.06 00:28) [3]
Не люблю, когда люди попусту тратят свое время, к тому же, тратя время других понапрасну...
ничего не можете сказать по данному вопросу, зачем вообще влезать в дискуссию?
Германн (2006-11-16 00:28:00) [9]
> Вопрос в другом, а как ты определишь наличие > каждого запускаемого
> пользователем файла в системе
Так он же Windows. Ему и карты в руки :-)
KilkennyCat (2006-11-15 23:09:00) [10]> [1] Rouse_ © (15.11.06 21:31)
микрофоном отслеживать дабл-клик мышки?
Rouse_ (2006-11-15 21:31:00) [11]ммм. ExtractFilePath вестимо. Вопрос в другом, а как ты определишь наличие > каждого запускаемого пользователем файла в системе