RSS订阅 | 匿名投稿
您的位置:网站首页 > 进程 > 正文

delphi 进程保护

作者:admin 来源: 日期:2018/1/17 8:03:41 人气: 标签:

Monitor是运行一个程序 
KMonitor是关闭一个程序 

procedure WaitProcess(ProcessID : DWORD); 
等待一个程序运行结束 

procedure StopProcess(ProcessID : DWORD); 
结束一个程序
-----------------------------------

program Monitor;

//{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  ProcLib in 'ProcLib.pas';

var
  Mutex : HWND;
begin
  Mutex := Windows.CreateMutex(nil, False,'Monitor');
  if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then
    Exit;
    
  G_ExeFile := ExtractFilePath(ParamStr(0))+'myApp.exe';

  while True do
  begin
    Sleep(2000);
    if ProcessRunning('myApp.exe') then
      Continue;

    if G_ExeFile ='' then
      Continue;

    Exec(G_ExeFile);
  end;
end.
--------------------------------------------------

unit ProcLib;

interface
uses
  Windows,SysUtils,PsApi,TlHelp32,shellapi;

function ProcessRunning(ExeName : string) : Boolean;
procedure Exec(FileName : string);

var G_ExeFile : string = '';

implementation

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 GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
          SetLength(Result, StrLen(PChar(Result)))
        else
          Result := '';
    finally
      CloseHandle(Handle);
    end;
end;

function ProcessRunning(ExeName : string) : Boolean;
var
  SnapProcHandle : THandle;
  NextProc: Boolean;
  ProcEntry: TProcessEntry32;
  ProcFileName : string;
begin
  Result := False;
  SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if SnapProcHandle=INVALID_HANDLE_VALUE then
    Exit;

  try
    ProcEntry.dwSize := SizeOf(ProcEntry);
    NextProc := Process32First(SnapProcHandle,ProcEntry);

    while NextProc do
    begin
      if ProcEntry.th32ProcessID <> 0 then
      begin
        ProcFileName := ProcessFileName(ProcEntry.th32ProcessID);
        if ProcFileName='' then
          ProcFileName := ProcEntry.szExeFile;

        if SameText(ExtractFileName(ProcFileName),ExeName) then
        begin
          G_CAMManager_File := ProcFileName;
          Result := True;
          Break;
        end;
      end;
      NextProc := Process32Next(SnapProcHandle,ProcEntry);
    end;
  finally
    CloseHandle(SnapProcHandle);
  end;
end;

procedure Exec(FileName : string);
var
  StartupInfo : TStartupInfo;
  ProcessInfo : TProcessInformation;
begin
  FillChar(StartupInfo,SizeOf(StartupInfo),#0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow:= SW_SHOWDEFAULT;
  if not CreateProcess(
    PChar(FileName),nil,nil,nil,False,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
    nil,PChar(ExtractFilePath(FileName)),StartupInfo,ProcessInfo) then
      Exit;
  WaitForSingleObject(processinfo.hProcess,INFINITE);
end;

end.

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址: