Показаны сообщения с ярлыком Кусочки кода. Показать все сообщения
Показаны сообщения с ярлыком Кусочки кода. Показать все сообщения

понедельник, 20 октября 2008 г.

Кусочки: Как, зная Handle окна программы, определить имя EXE

Как, зная Handle окна программы, определить имя EXE

// Для начала определимкакому процессу принадлежит окно:

 
Var pProcID : ^DWORD;
begin
 GetMem (pProcID, SizeOf (DWORD));
 GetWindowThreadProcessId (WinHandle, pProcID);
end;

 
// а после этого используйте  TProcessEntry32 примерно так:
 
function GetExeNameByProcID (ProcID : DWord) : String;
var
 ContinueLoop : BOOL;
 FSnapshotHandle : THandle;
 FProcessEntry32 : TProcessEntry32;
begin
 FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
 
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
 
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
 
 Result := '';
 while (Integer (ContinueLoop) <> 0) and (Result='') do
 begin
  if FProcessEntry32.th32ProcessID = ProcID then
  Result := FProcessEntry32.szExeFile;
  ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
end;

 
// Не забудьте в uses добавить Tlhelp32

Кусочки: Получение информации о выполняющихся процессах (Win2000)

Для NT-платформы (Windows NT/2000) программный код может выглядеть следующим образом: 
function GetProcessesWinNT(var Proc: TProcArray):Integer;
var
Num: Integer;
LP: Array[0..$3FFF-1] of Dword; // заведомо большой массив
CB: DWord;
CBNeeded:DWord;
ProcHndl: THandle;
ModHand: HModule;
ModName: array [0..MAX_PATH] of Char;
I: Integer;
begin
  EnumProcesses(@LP,CB,CBNeeded);
  Num:= CBNeeded div SizeOf(DWORD);
  SetLength(Proc,Num);
 For I:=0 to Num-1 do
  begin
  ProcHndl:=
  OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,LP[I]);
  If GetModuleFileNameEx(ProcHndl,ModHand,ModName,SizeOf(ModName))> 0 then
  Proc[I]:=ModName else Proc[I]:='Unknown';
  end;
IF ProcHndl > 0 then CloseHandle(ProcHndl);
Result:=Num;
end;


Здесь уже используется модуль PSAPI, который необходимо включить в раздел USES. Кому интересно разобраться в деталях данного кода отсылаю к справке по API. 

Замечу, что под управлением WINDOWS 2000, в списке процессов я наблюдал иногда "абракадабру" по путям некоторых процессов. Предлагаю в этом вопросе читателю разобраться самостоятельно, а у меня пока до этого не дошли руки. Тем не менее, считаю, что данная статья может послужить хорошим подспорьем, для всех интересующихся данным вопросом. 

В конце приведу код для определения платформы компьютера, поскольку он может понадобиться при реализации кода для вывода списка процессов. Оставляю его без комментариев. 
function GetPlatform: String;
var VI: TOSVersionInfo;
begin
VI.dwOSVersionInfoSize:=SizeOf(VI);
GetVersionEx(VI);
Case VI.dwPlatformId of
Ver_Platform_Win32s: Result:= 'Win32s';
Ver_Platform_Win32_Windows: Result:='Win95';
Ver_Platform_Win32_NT: Result:='WinNT'
else Result:='Unknown Platform'; 
end;
end;

Кусочки: Получение информации о выполняющихся процессах

Получить информацию о выполняющихся в данный момент на компьютере процессах можно на основе функций API. Для разных платформ эти функции отличаются, как и подключаемые для этих целей модули.

В Windows 95/98/2000/xp/nt код может выглядеть следующим образом: 

function GetProcessesWin95(var Proc: TProcArray):Integer;

var
FSnap: THandle;
PE: TProcessEntry32;
PPE: PProcessEntry32;
I: Integer;
begin
If FSnap > 0 then CloseHandle(FSnap);
FSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PE.dwSize:=SizeOf(PE);
I:=0;
SetLength(Proc,1000); // заведомо большой массив
If Process32First(FSnap,PE) then
  repeat
  New(PPE);
  PPE^:=PE;
  Proc[I]:=PPE.szExeFile;
  I:=I+1;
  until not Process32Next(FSnap, PE);
Result:=I;
end;


Для работы этого кода нужно подключить в разделе USES модуль TlHelp32 (Help Tool API 32). 

Функция возвращает число процессов и записывает их пути в массив-переменную Proc. Тип переменной Proc - обычный массив строк, который нужно описать в разделе описания типов: 

type TProcArray = Array of String;

Поясню основные моменты реализации кода. Строка 
 
FSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);

означает получение "моментального снимка всех процессов". Точнее, в результате ее выполнения мы получаем дескриптор снимка. Функции Process32First и Process32Next позволяют "пробежаться" по всем процессам. О более детальной информации отсылаю читателя к справочной литературе об API.

суббота, 18 октября 2008 г.

Кусочки: Примерная защита Shareware приложения

После добавления следующего кода в программу, она запустится только один раз за время сессии Windows. Для повторного запуска программы необходимо будет перезагрузить Windows. 

procedure TForm1.FormShow(Sender : TObject); 

var atom : integer; 

CRLF : string; 
begin 

if 
GlobalFindAtom('THIS_IS_SOME_OBSCUREE_TEXT') = 0 then 
atom := GlobalAddAtom('THIS_IS_SOME_OBSCUREE_TEXT') 
else 
begin 
  CRLF := #10 + #13; 
  ShowMessage('This programm will start only once' + CRLF + 
  for next start reboot windows please, or...' + CRLF + 
  'REGISTER PROGRAM !!'); 
  Close; 
end; 
end;