Roberto, show de bola sua dica, parabéns!!.

DEUS É PAI.
[]'s
Allan
msn [EMAIL PROTECTED]
Skype allan_gabriel
  ----- Original Message ----- 
  From: JJW Informática Ltda. - Roberto 
  To: delphi-br@yahoogrupos.com.br 
  Sent: Monday, August 21, 2006 5:00 PM
  Subject: Re: [delphi-br] Travar Sistema


  uses
    Forms,
    Classes,
    SysUtils,
    Windows,
    Controls,
    Psapi,
    tlhelp32;

  type
    TJJWProcessInformation = record
      FileName: string;
      Path: string;
    end;

    TJJWProcessList = array of TJJWProcessInformation;

  // retira a lista de processos de do windows 98  
  procedure CreateWin9xProcessList(var AList: TJJWProcessList);
  var
    hSnapShot: THandle;
    ProcInfo: TProcessEntry32;
    I: Integer;
  begin
    SetLength(AList, 0);

    hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapShot <> THandle(-1)) then
    begin
      ProcInfo.dwSize := SizeOf(ProcInfo);
      if (Process32First(hSnapshot, ProcInfo)) then
      begin
        I := Length(AList);
        SetLength(AList, I +1);
        AList[I].FileName := ExtractFileName(ProcInfo.szExeFile);
        AList[I].Path := ExtractFilePath(ProcInfo.szExeFile);

        while (Process32Next(hSnapShot, ProcInfo)) do
        begin
          I := Length(AList);
          SetLength(AList, I +1);
          AList[I].FileName := ExtractFileName(ProcInfo.szExeFile);
          AList[I].Path := ExtractFilePath(ProcInfo.szExeFile);
        end;
      end;
      CloseHandle(hSnapShot);
    end;
  end;

  // retira a lista de processos do windows NT/2000/XP/2003
  procedure CreateWinNTProcessList(var AList: TJJWProcessList);

    type
      PTOKEN_USER = ^TOKEN_USER;

      _TOKEN_USER = record
        User: TSidAndAttributes;
      end;

      TOKEN_USER = _TOKEN_USER;

    // retorna o domínio e usuário dono de um processo
    function GetUserAndDomainFromPID(ProcessId: DWORD;
      var User, Domain: string): Boolean;
    var
      hToken: THandle;
      cbBuf: Cardinal;
      ptiUser: PTOKEN_USER;
      snu: SID_NAME_USE;
      ProcessHandle: THandle;
      UserSize, DomainSize: DWORD;
      bSuccess: Boolean;
    begin
      Result := False;
      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
      if ProcessHandle <> 0 then
      begin
      //  EnableProcessPrivilege(ProcessHandle, 'SeSecurityPrivilege', True);
        if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
        begin
          bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
          ptiUser  := nil;
          while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
          begin
            ReallocMem(ptiUser, cbBuf);
            bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, 
cbBuf);
          end;
          CloseHandle(hToken);

          if not bSuccess then
            Exit;

          UserSize := 0;
          DomainSize := 0;
          LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, 
DomainSize, snu);
          if (UserSize <> 0) and (DomainSize <> 0) then
          begin
            SetLength(User, UserSize);
            SetLength(Domain, DomainSize);
            if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize,
              PChar(Domain), DomainSize, snu) then
            begin
              Result := True;
              User := StrPas(PChar(User));
              Domain := StrPas(PChar(Domain));
            end;
          end;

          if bSuccess then
          begin
            FreeMem(ptiUser);
          end;
        end;
        CloseHandle(ProcessHandle);
      end;
    end;

    // retorna o nome do usuário logado atualmente
    function _GetUserName : string;
    const
      MAX_USER_NAME_LEN = 254;
    var
      UserName: string;
      UserNameLen: DWORD;
    begin
      UserNameLen := MAX_USER_NAME_LEN - 1;
      SetLength(UserName, MAX_USER_NAME_LEN);
      if GetUserName(PChar(UserName), UserNameLen) then
        Result := Copy(UserName, 1, UserNameLen -1)
      else
        Result := EmptyStr;
    end;

  var
    PIDArray: array [0..1023] of DWORD;
    cb: DWORD;
    I, J: Integer;
    ProcCount: Integer;
    hMod: HMODULE;
    hProcess: THandle;
    ModuleName: array [0..300] of Char;
    User, Domain, CurrentUser: string;
  begin
    CurrentUser := _GetUserName;

    EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
    ProcCount := cb div SizeOf(DWORD);
    for I := 0 to ProcCount - 1 do
    begin
      hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
        PROCESS_VM_READ,
        False,
        PIDArray[I]);
      if (hProcess <> 0) then
      begin
        GetUserAndDomainFromPID(PIDArray[I], User, Domain);

        EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
        GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));

        if AnsiSameText(User, CurrentUser) then
        begin
          J := Length(AList);
          SetLength(AList, J +1);
          AList[J].FileName := ExtractFileName(ModuleName);
          AList[J].Path := ExtractFilePath(ModuleName);
        end;

        CloseHandle(hProcess);
      end;
    end;
  end;

  // retira a lista de processos independente da versão do windows
  procedure GetProcessList(var AList: TJJWProcessList);
  var
    ovi: TOSVersionInfo;
  begin
    ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
    GetVersionEx(ovi);
    case ovi.dwPlatformId of
      VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(AList);
      VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(AList);
    end
  end;

  ------- USANDO -------------

    GetProcessList(ProcessList);
    Count := 0;
    for I := Low(ProcessList) to High(ProcessList) do
      if AnsiSameText(ProcessList[I].FileName, ExtractFileName(ParamStr(0))) 
then
        Inc(Count);

    Count irá guardar quantas instâncias do seu sistema estão abertas. coloque 
esse código no seu DPR para fazer a verificação q necessita



  [As partes desta mensagem que não continham texto foram removidas]

   


[As partes desta mensagem que não continham texto foram removidas]






-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Responder a