PDA

View Full Version : Can InstallShield find FileVersion?



messkat
02-08-2002, 12:24 PM
I'm a relative newbie to InstallShield and I'm trying to find the dll header item FileVersion as opposed to FILEVERSION. Is this possible without writing my own tool?

Uriel Volovich
02-17-2002, 11:13 AM
You may to use the next code in InstallShield script:

prototype LONG version.GetFileVersionInfoSizeA(STRING,
POINTER);
prototype BOOL version.GetFileVersionInfoA(STRING, INT, INT,
POINTER);
prototype BOOL version.VerQueryValueA(POINTER, STRING,
BYREF POINTER, POINTER);

typedef VS_FIXEDFILEINFO
begin
INT dwSignature;
INT dwStrucVersion;
INT dwFileVersionMS;
INT dwFileVersionLS;
INT dwProductVersionMS;
INT dwProductVersionLS;
INT dwFileFlagsMask;
INT dwFileFlags;
INT dwFileOS;
INT dwFileType;
INT dwFileSubtype;
INT dwFileDateMS;
INT dwFileDateLS;
end;

///////////////////////////////////////////////////////////////////////////////
function func()
NUMBER nResult;
NUMBER stub, VerLen, VerBufferLen, ver[4];
char VerData[2000];
STRING FileName;
VS_FIXEDFILEINFO POINTER VerBuffer;
BOOL res;
begin

FileName = "YourFileName";
nResult = UseDLL(WINSYSDIR ^ "version.dll");
if (nResult) then
return -1;
endif;

VerLen = 0;
VerLen = GetFileVersionInfoSizeA(FileName,&stub);
if (!VerLen) then
return -1;
endif;

res = GetFileVersionInfoA(FileName,NULL,VerLen,&VerData);
if (!res) then
return -1;
endif;

res = VerQueryValueA(&VerData, "\\", VerBuffer,
&VerBufferLen);
if(!res) then
return -1;
endif;

ver[0] = (VerBuffer->dwFileVersionMS & 0xFFFF0000) >> 16;
ver[1] = VerBuffer->dwFileVersionMS & 0x0000FFFF;
ver[2] = (VerBuffer->dwFileVersionLS & 0xFFFF0000) >> 16;
ver[3] = VerBuffer->dwFileVersionLS & 0x0000FFFF;

SprintfBox(INFORMATION, "File Version",
"File version=%d.%d.%d.%d", ver[0], ver[1], ver[2], ver[3]);

return 0;
end;

messkat
02-18-2002, 09:08 AM
Thanks so much for this code! It's much more convenient than building a C++ dll for the same purpose.

messkat
02-25-2002, 12:46 PM
The above code only gives me what the built-in VerGetFileVersion() gives me. I'm looking for VarFileInfo values.

The code in C++ looks something like

UINT uSize;
DWORD *pTranslation;
VerQueryValue(pVersionInfo, L"\\VarFileInfo\\Translation",
(void**) &pTranslation, &uSize)

I'll try to translate it myself but if anyone has done it I'd appreciate help since I'm a newbie to InstallShield.

Thanks in advance