quarta-feira, março 23, 2005

PowerBuilder – Recuperando informações de um Arquivo

A partir do PowerBuilder 8, temos a opção de informar no projeto qual a versão do nosso executável, mas não conseguimos recuperar essa informação de forma fácil.
Abaixo está o código necessário para recuperar as informações ou matadados de um arquivo.



//*****************Declare as seguintes external functions
FUNCTION ulong GetFileVersionInfoSizeA( REF string lpFilename, REF ulong lpdwHandle ) LIBRARY "version.dll"
FUNCTION integer GetFileVersionInfoA( REF string lpFilename, REF ulong lpdwHandle, ulong dwLen, REF string lpData ) LIBRARY "version.dll"
FUNCTION boolean VerQueryValueA( REF string lpBlock, string lpSubBlock, REF long lpBuffer, REF uint puLen ) LIBRARY "version.dll"
SUBROUTINE CopyMemory ( REF string d, long s, long l ) LIBRARY "kernel32.dll" ALIAS FOR RtlMoveMemory

//*******Código utilizado para recuperar o número de versão do produto no executável
string vls_filename, vls_Buff, vls_key
ulong vlul_Handle, vlul_Length
integer vli_rc
long vll_pointer
uint vlui_length

//Busca o tamanho do buffer do aplicativo
vlul_Length = GetFileVersionInfoSizeA( p_nom_executavel, vlul_Handle )
IF vlul_Length <= 0 THEN
return error.of_popula( populateerror(1010, 'Não foi possivel localizar o arquivo para o controle de versão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
END IF

vls_Buff = Space( vlul_Length )

//Busca o ponteiro para as informações do executavel
vli_rc = GetFileVersionInfoA( p_nom_executavel, vlul_Handle, vlul_Length, vls_Buff )

IF vli_rc = 0 THEN
return error.of_popula( populateerror(1010, 'Ocorreu um erro ao recuperar informação de versão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
END IF

//Define qual informação sera recurperada
//Onde \StringFileInfo\\
//vls_key = "\StringFileInfo\040904e4\FileVersion"
vls_key = "\StringFileInfo\040904e4\ProductVersion"


IF NOT VerQueryValueA( vls_buff, vls_key, vll_pointer, vlui_length ) OR &
vlul_Length <= 0 THEN
p_versao = ""
return error.of_popula( populateerror(1010, 'Ocorreu um erro ao recuperar o número da vesão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
ELSE
p_versao = Space( vlui_length )
CopyMemory( p_versao, vll_pointer, vlui_length )
END IF

return 1

2 comentários:

Anônimo disse...

Ei cara, também trabalho com PowerBuilder e também estouem Belo horizonte ... visite www.duard.com.br/blog ;-)

Anônimo disse...

Ei cara, também trabalho com PowerBuilder e também estouem Belo horizonte ... visite www.duard.com.br/blog ;-)