Artigo no estilo: Curso
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
· 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
· 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).
ArquivosO 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 ...