Artigo no estilo: Curso

Por que eu devo ler este artigo:Recursos como o de criar pastas, achar determinado arquivo, apagar temporários após sua utilização, entre outros, estão disponíveis pela API do Windows, que é um conjunto de DLLs que fazem parte do sistema, expondo as funções do mesmo. Nesse artigo vamos explorar as APIs da categoria Arquivos, Cursores, Registros e Informações sobre o sistema e Windows.

As APIs do Windows são expostas através de DLLs que podem ser utilizadas no Delphi e quando as utilizamos estamos lidamos diretamente com o sistema operacional. Dentre as categorias existentes nas APIs, pode-se dizer que as principais são:

· Windows;

· Arquivos;

· Informações sobre o sistema;

· Cursores;

· Mensagens;

· Mouse;

· Teclado;

· Impressoras;

· Ícones;

· Arquivos INI;

· Registro;

· Dispositivos;

· Acessibilidade.

A Embarcadero disponibiliza no Delphi o acesso a essas APIs através da unit Windows, que realiza uma ponte entre o código Delphi e as várias DLLs disponibilizadas pelo sistema. As principais DLLs são:

· User32.dll;

· kernel32.dll;

· Comdlg32.dll;

· gdi32.dll;

· shell32.dll;

· Advapi32.dll;

· winmm.dll.

Uma DLL (Dynamic-link library ou biblioteca de vínculo dinâmico), é um arquivo com extensão que consiste numa coleção de funções e procedures que podem ser chamadas por outras aplicações e outras DLLs, que por sua vez, é ligada em tempo de execução ao programa que as usa.

Informações sobre o Sistema

É possível obter informações sobre o Sistema através de algumas funções expostas:

· GetComputerName: está declarada em kernel32.dll e irá ler o nome do computador, que será devolvido em uma variável do tipo string. Esta deve ser passada como parâmetro na função. Sua declaração é feita da seguinte forma:

GetComputerNameA (ByVal lpBuffer As String, nSize As Long) As Long
O parâmetro lpBuffer é uma sequência de caracteres que deve ser grande o suficiente para manter o nome do computador. Já nSize é o comprimento em caracteres de lpBuffer, geralmente usado com o valor 255.

· GetUserName: está declarada em advapi32.dll e recupera o nome do usuário que está logado no Windows. Este também é retornado em uma string que devemos passar como parâmetro. Sua declaração é a seguinte:

GetUserNameA (ByVal lpBuffer As String, nSize As Long) As Long
O lpBuffer é uma sequência de caracteres que deve ser grande o suficiente para manter o nome do usuário. O nSize é o comprimento em caracteres de lpBuffer, geralmente com o valor 144.

· GetSystemDirectory: retorna o caminho do diretório de sistema do Windows. É importante observar é que nunca devemos assumir que o diretório é “C:\Windows\System”, porque o diretório não necessariamente precisa ser chamado Windows. Sua declaração é parecida com as outras duas que vimos anteriormente e até mesmo os mesmos parâmetros são parecidos. Ela está declarada em kernel32.dll e sua declaração é:

GetSystemDirectoryA (ByVal lpBuffer As String, ByVal nSize As Long) As Long

· GetWindowsDirectory: está declarada em kernel32.dll e retorna o caminho do diretório do Windows. É onde o próprio Windows está instalado, contudo, isso não significa que seja sempre “C:\Windows”. Sua declaração é:

GetWindowsDirectoryA (ByVal lpBuffer As String, ByVal nSize As Long) As Long 

· GetTempPath: retorna o diretório Temp do Windows, onde ficam os arquivos temporários. A função está declarada em kernel32.dll e, ao contrário das quatro funções vistas anteriormente, aqui os parâmetros se invertem. Primeiro é passado o tamanho a ser usado para receber a string, e depois o parâmetro da mesma, como na declaração a seguir:

GetTempPathA (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long 

· GetVersionEx: declarada em kernel32.dll, esta função retorna as informações sobre a versão do Windows em execução. Essas informações incluem o número da versão, o build e a versão do sistema instalado. Essas informações são transferidas para uma variável do tipo OSVersionInfo, que é do tipo record, conforme a sua declaração:

GetVersionExA (lpVersionInformation As OSVERSIONINFO) As Long 

Aplicação sobre Informações do Sistema

Para mostrar como utilizar essas APIs vamos desenvolver uma aplicação. Nela teremos apenas uma tela com seis TEdits, seis TLabels e um TButton, como vemos na Figura 1.

Tela do
aplicativo

Figura 1. Tela do aplicativo

A propriedade Name do Form1 é modificada para Frm_Principal, e os seis TEdits para Edt_CompNome, Edt_UsurNome, Edt_PastaSys, Edt_WinDiretorio, Edt_PastaTemp e Edt_WinVersao. O botão recebe o nome de Btn_Informacoes e os seis TLabels têm sua propriedade name modificada para Lbl_CompNome, Lbl_UsurNome, Lbl_PastaSys, Lbl_WinDiretorio, Lbl_PastaTemp, e Lbl_WinVersao. Ao salvar a aplicação ajustamos a unit para o nome de Unt_Principal e o projeto para InfoSys. Já a propriedade Caption dos Tlabels deve ficar como visto na Figura 1.

Procedimentos e Funções da Seção Private

Na seção private são declaradas seis funções, como mostra a Listagem 1. Elas são responsáveis por acessar as APIs. Uma vez declaradas pressionamos a combinação Shift + Ctrl + C e com isso o Delphi inicia a implementação dessas funções, que podemos ver no código da Listagem 2.

Listagem 1. Seção Private do Frm_Principal


    private
      function fGetComputerName: String;
      function fGetUserName: String;
      function fGetSystemDirectory: String;
      function fWindowsDirectory: String;
      function fGetTempPath: String;
      function fGetVersionEx: string;

Listagem 2. Implementação


  procedure TFrm_Principal.Btn_InformacoesClick(Sender: TObject);
  begin
    Edt_CompNome.Text     := fGetComputerName;
    Edt_UsurNome.Text     := fGetUserName;
    Edt_PastaSys.Text     := fGetSystemDirectory;
    Edt_WinDiretorio.Text := fWindowsDirectory;
    Edt_PastaTemp.Text    := fGetTempPath;
    Edt_WinVersao.Text    := fGetVersionEx;
  end;
   
  function TFrm_Principal.fGetComputerName: String;
  var
    Buffer: Array[0..255] of Char;
    I: DWord;
  begin
    I := SizeOf(Buffer);
    GetComputerName(Buffer, I);
    Result := StrPas(Buffer);
  end;
   
  function TFrm_Principal.fGetSystemDirectory: String;
  var
    Buffer: Array[0..255] of Char;
  begin
    GetSystemDirectory(Buffer, 255);
    Result := StrPas(Buffer);
  end;
   
  function TFrm_Principal.fGetTempPath: String;
  var
    Buffer: Array[0..255] of Char;
  begin
    GetTempPath(255, Buffer);
    Result := StrPas(Buffer);
  end;
   
  function TFrm_Principal.fGetUserName: String;
  var
    Buffer: Array[0..255] of Char;
    I: DWord;
  begin
    I := SizeOf(Buffer);
    GetUserName(Buffer, I);
    Result := StrPas(Buffer);
  end;
   
  function TFrm_Principal.fWindowsDirectory: String;
  var
    Buffer: Array[0..255] of Char;
  begin
    GetWindowsDirectory(Buffer, 255);
    Result := StrPas(Buffer);
  end;
   
  function TFrm_Principal.fGetVersionEx: string;
  var
    VersionInfo: TOSVersionInfo;
  begin
    VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
   
    GetVersionEx(VersionInfo);
   
    with VersionInfo do
    begin
      case dwPlatformid of
        0: begin
             Result := 'Windows 3.11';
           end;
   
        1: begin
             case dwMinorVersion of
               0: Result := 'Windows 95';
   
               10: begin
                     if (szCSDVersion[ 1 ] = 'A' ) then
                       Result :='Windows 98 SE'
                     else
                       Result := 'Windows 98';
                   end;
   
               90: Result := 'Windows Millenium';
               else
                 Result := 'Não achei a Versão';
             end;
           end;
   
         2: begin
              case dwMajorVersion of
                3: Result := 'Windows NT ' + IntToStr(dwMajorVersion) + '.' +
                             IntToStr(dwMinorVersion);
   
                4: Result := 'Windows NT ' + IntToStr(dwMajorVersion) + '.' +
                             IntToStr(dwMinorVersion);
   
                5: begin
                     case dwMinorVersion of
                       0: Result := 'Windows 2000';
                       1: Result := 'Windows XP';
                     end;
                   end;
   
                6: Result := 'Windows 7 ' + IntToStr(dwMajorVersion) + '.' +
                             IntToStr(dwMinorVersion);
   
                7: Result := 'Windows 8 ' + IntToStr(dwMajorVersion) + '.' +
                             IntToStr(dwMinorVersion);
   
                8: Result := 'Windows Vista ' + IntToStr(dwMajorVersion) + '.' +
                             IntToStr(dwMinorVersion);
                else
                  Result := 'Não achei a Versão';
              end;
   
              if szCSDVersion <> '' then
                Result := Result + ' ' + szCSDVersion;
            end;
         else
           Result := 'Não achei a Platforma';
      end;
   
      Result := Result + ', Build: ' + IntToStr(Loword(dwBuildNumber)) ;
    end;
  end;
   
  end.

As funções a seguir foram criadas para obter informações e repassá-las aos controles TEdit:

· StrPas – É a função declarada na Unit SysUtils que converte uma cadeia de strings, terminado em nulo, para uma cadeia de string longa (AnsiString).

· SizeOf – É a função declarada na Unit System, que retorna o tamanho em bytes de uma variável ou tipo.

· TOSVersionInfo – É um record declarado em SysUtils, que contém informações do sistema operacional, plataforma (Windows, Mac Os X), versão, tipo de arquitetura (Intel x86 ou Intel x64) e Service Pack. Esse record contém dois tipos públicos:

o TArchitecture (arIntelX86, arIntelX64, arARM32);

o TPlatform (pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux).

Arquivos

O Windows oferece uma grande variedade de funções para tratamento de arquivos como vemos a seguir:

· CopyFile: está declarada em kernel32.dll e copia um arquivo de um local para outro, assim como a cópia de um arquivo no Windows Explorer. Em sua declaração temos três parâmetros:

o LpExistingFileName - O arquivo de origem, ou seja, o arquivo a ser copiado;

o LpNewFileName - O arquivo de destino, ou seja, o novo arquivo para criar;

o BFailIfExists - Se 0, a função irá substituir LpNewFileName caso ele já existe, caso contrário, a função irá falhar.

· MoveFile: move ou renomeia um arquivo ou pasta. Se um diretório é movido/renomeado, todos os subdiretórios e arquivos contidos nele serão afetados. A função retorna 1 se for bem-sucedida ou zero se ocorrer um erro. Espera-se dois parâmetros:

o LpExistingFileName - O arquivo de origem ou diretório, ou seja, o arquivo ou diretório para renomear (mover);

o Lp ...

Quer ler esse conteúdo completo? Tenha acesso completo