So why aren't you a member? Join up!
This is a guest message and you can easily put whatever you want here to get potential members to join up. The text can be changed in seconds using the settings file. This message will only appear to guests but can be turned off completely if so desired.
Stawer

Você não está conectado. Conecte-se ou registre-se

[VB3/VB4][Dica][Código] Simplificando chamadas API através de funções próprias

3 participantes

Ir para baixo  Mensagem [Página 1 de 1]

Snake Simpson

Snake Simpson
Amador

Amador

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

DeeW.

DeeW.
Amador

Amador

Bem interessante! VB, uma linguagem boa!

xAlmis

xAlmis
Membro

Membro

Obrigado pelo tutorial.Irá ajudar vários usuários.

Conteúdo patrocinado



Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos