[파워빌더] Set and retrieve the executable version
On Windows, the properties tab on an executable can show a version number. By default, an executable produced by Powerbuilder shows the Powerbuilder version number not the version of the executable itself.Here a way to embed your own version number. By reading it back, it's possible to validate if the executable is the current one against a special table in your application's database for example.
You need a special utility to change the version of the executable. A freeware utility to do that can be downloaded from http://www.elphin.com/downloads/stampver/.Create a response file to contains you version number with the right formatting (in this example, only the first 3 numbers are used).
;StampVer information file (myapp.inf)
FileVersion=1.0.2.0
FileFormat=%02a.%02b.%02c
Now you can the version number withstampver -v"myapp.inf" myapp.exe
Showing the properties/version tab for this executable will show your version number and not the Sybase one now.This freeware can deal only with the file version, not the product information or any other infos shown on properties/version tab. To change these values, look at the Crane computing site, they have product that can do that with a nice gui interface.
To retrieve the version from an executable :[local external function declaration]
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
[powerscript]
ulong dwHandle, dwLength
string ls_Buff, ls_key, ls_versioninfo
uint lui_length
long ll_pointer
string as_filename = "d:\dev\pb6\myapp.exe"
integer li_rc
dwLength = GetFileVersionInfoSizeA( as_filename, dwHandle )
IF dwLength <= 0 THEN
RETURN
END IF
ls_Buff = Space( dwLength )
li_rc = GetFileVersionInfoA( as_filename, dwHandle, dwLength, ls_Buff )
IF li_rc = 0 THEN
RETURN
END IF
// the strange numbers below represents the country and language
// of the version ressource.
ls_key = "\StringFileInfo\040904e4\FileVersion"
IF NOT VerQueryValueA( ls_buff, ls_key, ll_pointer, lui_length ) OR &
lui_length <= 0 THEN
ls_versioninfo = "?"
ELSE
ls_versioninfo = Space( lui_length )
CopyMemory( ls_versioninfo, ll_pointer, lui_length )
END IF
Messagebox("version", ls_versioninfo)
You need a special utility to change the version of the executable. A freeware utility to do that can be downloaded from http://www.elphin.com/downloads/stampver/.Create a response file to contains you version number with the right formatting (in this example, only the first 3 numbers are used).
;StampVer information file (myapp.inf)
FileVersion=1.0.2.0
FileFormat=%02a.%02b.%02c
Now you can the version number withstampver -v"myapp.inf" myapp.exe
Showing the properties/version tab for this executable will show your version number and not the Sybase one now.This freeware can deal only with the file version, not the product information or any other infos shown on properties/version tab. To change these values, look at the Crane computing site, they have product that can do that with a nice gui interface.
To retrieve the version from an executable :[local external function declaration]
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
[powerscript]
ulong dwHandle, dwLength
string ls_Buff, ls_key, ls_versioninfo
uint lui_length
long ll_pointer
string as_filename = "d:\dev\pb6\myapp.exe"
integer li_rc
dwLength = GetFileVersionInfoSizeA( as_filename, dwHandle )
IF dwLength <= 0 THEN
RETURN
END IF
ls_Buff = Space( dwLength )
li_rc = GetFileVersionInfoA( as_filename, dwHandle, dwLength, ls_Buff )
IF li_rc = 0 THEN
RETURN
END IF
// the strange numbers below represents the country and language
// of the version ressource.
ls_key = "\StringFileInfo\040904e4\FileVersion"
IF NOT VerQueryValueA( ls_buff, ls_key, ll_pointer, lui_length ) OR &
lui_length <= 0 THEN
ls_versioninfo = "?"
ELSE
ls_versioninfo = Space( lui_length )
CopyMemory( ls_versioninfo, ll_pointer, lui_length )
END IF
Messagebox("version", ls_versioninfo)