Algumas chamadas à função API (DLL) são bastante complexas. Uma dica é criar uma função de código VB que chama a API. Assim, a complexidade da API só irá aparecer uma vez. Por exemplo, a função GetPrivateProfileString que, captura uma configuração de arquivo INI.
- Código:
Declare Function GetPrivateProfileString Lib "Kernel" (ByVal _
lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault _
As String, ByVal lpReturnedString As String, ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer
A chamada da função ficaria assim:
- Código:
Global Const Ini_File = App.path & "\Myapp.INI)
'...
Dim VA_LastUser
'chamada a API para capturar o conteúdo de "lastuser" na seção "options"
On Error GoTo Erro_INI
Dim VL_Sec As String, VL_Key As String, VL_Size As Integer
Dim VL_Return As String, VL_FileName As String
Dim VL_SizeHandle As Integer, VL_Valid As Integer
Dim Va_Msg As String
Const CL_Default = "" 'retorno no caso de não encontrar
VL_Sec = "options"
VL_Key = "lastuser"
VL_Size = 30
VL_Return = Space$(VL_Size) 'string a retornar
VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno
VL_FileName = Ini_File 'arquivo no formato INI
VL_Valid = GetPrivateProfileString(VL_Sec, VL_Key, CL_Default, _
VL_Return, VL_SizeHandle, VL_FileName)
VA_LastUser = Left$(VL_Return, VL_Valid)
Exit Function 'ou Exit Sub
Erro_LeMeuINI:
VA_LastUser = CL_Default
Nota-se uma complexa e grande quantidade de código. A API não retorna a string procurada e sim um buffer. O conteúdo é retornado por um argumento (!) e precisa ser formatado com o tamanho do buffer (função left). Para eliminar todo este código a cada necessidade (cada campo INI) foi implementada uma chamada assim:
- Código:
Global Const Ini_File = App.path & "\Myapp.INI)
'...
Dim VA_LastUser
'chamada a API para capturar o conteúdo de "lastuser" na seção "options"
Global Const Ini_File = "MYAPP.INI"
...
VA_LastUser = FU_Le_MeuINI ("options", "lastuser", 30)
Abaixo, um exemplo de função "tradutora" de API:
Function FU_Le_MeuIni (VL_Sec As String, VL_Key As String, VL_Size As Integer) As String
'recebe nome da seção e do parágrafo e tamanho da string de retorno
'retorna valor encontrado (string) ou ""
'usa a constante Ini_File e
'a API (Windows 3.1 Kernel) GetPrivateProfileString
On Error GoTo Erro_LeMeuINI
Dim VL_Return As String, VL_FileName As String
Dim VL_SizeHandle As Integer, VL_Valid As Integer
Dim Va_Msg As String
Const CL_Default = "" 'retorno no caso de não encontrar
VL_Return = Space$(VL_Size) 'string a retornar
VL_SizeHandle = Len(VL_Return) 'tamanho da string de retorno
VL_FileName = Ini_File 'arquivo no formato INI
VL_Valid = GetPrivateProfileString(VL_Sec, VL_Key, CL_Default, _
VL_Return , VL_SizeHandle, VL_FileName)
FU_Le_MeuIni = Left$(VL_Return, VL_Valid)
Exit Function
Erro_LeMeuINI:
FU_Le_MeuIni = CL_Default
Resume Next
End Function
A função usada como exemplo é do VB3, podendo ser usada em VB4 se sua aplicação for em 16 bits. Mas, o conceito de criar funções "traduzidas" ou "facilitadas" de API é aplicável a qualquer versão do Visual Basic.
Créditos: Charles A. Müller
Créditos: Charles A. Müller