Explorando APIs do Windows em Delphi - Parte 1

Neste artigo veremos algumas APIS do Windows que podem ser acessadas pelo Delphi, dentre as quais destacaremos as da categoria Arquivos, Cursores, Registros e Informações.

Artigo no estilo: Curso

Fique por dentro
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.

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. "

[...] continue lendo...

Artigos relacionados