Weiß vielleicht irgend jemand, weshalb der folgende Code unter Delphi 2009
keine Resultate liefert, wenn er mit älteren Versionen kompiliert wird aber schon?
keine Resultate liefert, wenn er mit älteren Versionen kompiliert wird aber schon?
Code:
FUNCTION FileVersionInfo(CONST sAppNamePath : TFileName) : TFileVersionInfo; VAR rSHFI : TSHFileInfo; iRet : INTEGER; VerSize : INTEGER; VerBuf : PChar; VerBufValue : POINTER; VerHandle : Cardinal; VerBufLen : Cardinal; VerKey : STRING; FixedFileInfo : PVSFixedFileInfo; // dwFileType, dwFileSubtype FUNCTION GetFileSubType(FixedFileInfo : PVSFixedFileInfo) : STRING; BEGIN CASE FixedFileInfo.dwFileType OF VFT_UNKNOWN : Result := 'Unknown'; VFT_APP : Result := 'Application'; VFT_DLL : Result := 'DLL'; VFT_STATIC_LIB : Result := 'Static-link Library'; VFT_DRV : CASE FixedFileInfo.dwFileSubtype OF VFT2_UNKNOWN : Result := 'Unknown Driver'; VFT2_DRV_COMM : Result := 'Communications Driver'; VFT2_DRV_Printer : Result := 'Printer Driver'; VFT2_DRV_KEYBOARD : Result := 'Keyboard Driver'; VFT2_DRV_LANGUAGE : Result := 'Language Driver'; VFT2_DRV_DISPLAY : Result := 'Display Driver'; VFT2_DRV_MOUSE : Result := 'Mouse Driver'; VFT2_DRV_NETWORK : Result := 'Network Driver'; VFT2_DRV_SYSTEM : Result := 'System Driver'; VFT2_DRV_INSTALLABLE : Result := 'InstallableDriver'; VFT2_DRV_Sound : Result := 'Sound Driver'; END; VFT_Font : CASE FixedFileInfo.dwFileSubtype OF VFT2_UNKNOWN : Result := 'Unknown Font'; VFT2_Font_RASTER : Result := 'Raster Font'; VFT2_Font_VECTOR : Result := 'Vector Font'; VFT2_Font_TRUETYPE : Result := 'Truetype Font'; ELSE; END; VFT_VXD : Result := 'Virtual Defice Identifier = ' + IntToHex(FixedFileInfo.dwFileSubtype, 8); END; END; FUNCTION HasdwFileFlags(FixedFileInfo : PVSFixedFileInfo; Flag : WORD) : BOOLEAN; BEGIN Result := (FixedFileInfo.dwFileFlagsMask AND FixedFileInfo.dwFileFlags AND Flag) = Flag; END; FUNCTION GetFixedFileInfo : PVSFixedFileInfo; BEGIN IF NOT VerQueryValue(VerBuf, '', POINTER(Result), VerBufLen) THEN Result := NIL END; FUNCTION GetInfo(CONST aKey : STRING) : STRING; BEGIN Result := ''; VerKey := Format('\StringFileInfo\%.4x%.4x\%s', [LoWord(INTEGER(VerBufValue^)), HiWord(INTEGER(VerBufValue^)), aKey]); IF VerQueryValue(VerBuf, PChar(VerKey),VerBufValue,VerBufLen) THEN Result := STRING(VerBufValue); END; FUNCTION QueryValue(CONST aValue : STRING) : STRING; Var Value : PChar; BEGIN Result := ''; // obtain version information about the specified file IF GetFileVersionInfo(PChar(sAppNamePath), VerHandle, VerSize, VerBuf) AND // return selected version information VerQueryValue(VerBuf, PChar('\VarFileInfo\Translation'), VerBufValue, VerBufLen) THEN Result := GetInfo(aValue); END; BEGIN // Initialize the Result WITH Result DO BEGIN FileType := ''; CompanyName := ''; FileDescription := ''; FileVersion := ''; InternalName := ''; LegalCopyRight := ''; LegalTradeMarks := ''; OriginalFileName := ''; ProductName := ''; ProductVersion := ''; Comments := ''; SpecialBuildStr := ''; PrivateBuildStr := ''; FileFunction := ''; DebugBuild := FALSE; Patched := FALSE; PreRelease := FALSE; SpecialBuild := FALSE; PrivateBuild := FALSE; InfoInferred := FALSE; END; // Get the file type IF SHGetFileInfo(PChar(sAppNamePath), 0, rSHFI, SizeOf(rSHFI), SHGFI_TYPENAME) <> 0 THEN Result.FileType := rSHFI.szTypeName; iRet := SHGetFileInfo(PChar(sAppNamePath), 0, rSHFI, SizeOf(rSHFI), 0); IF iRet <> 0 THEN BEGIN // determine whether the OS can obtain version information VerSize := GetFileVersionInfoSize(PChar(sAppNamePath), VerHandle); IF VerSize > 0 THEN BEGIN VerBuf := AllocMem(VerSize); TRY WITH Result DO BEGIN CompanyName := QueryValue('CompanyName'); FileDescription := QueryValue('FileDescription'); FileVersion := QueryValue('FileVersion'); InternalName := QueryValue('InternalName'); LegalCopyRight := QueryValue('LegalCopyRight'); LegalTradeMarks := QueryValue('LegalTradeMarks'); OriginalFileName := QueryValue('OriginalFileName'); ProductName := QueryValue('ProductName'); ProductVersion := QueryValue('ProductVersion'); Comments := QueryValue('Comments'); SpecialBuildStr := QueryValue('SpecialBuild'); PrivateBuildStr := QueryValue('PrivateBuild'); // Fill the VS_FIXEDFILEINFO structure FixedFileInfo := GetFixedFileInfo; DebugBuild := HasdwFileFlags(FixedFileInfo,VS_FF_DEBUG); PreRelease := HasdwFileFlags(FixedFileInfo,VS_FF_PRERELEASE); PrivateBuild := HasdwFileFlags(FixedFileInfo,VS_FF_PRIVATEBUILD); SpecialBuild := HasdwFileFlags(FixedFileInfo,VS_FF_SPECIALBUILD); Patched := HasdwFileFlags(FixedFileInfo,VS_FF_PATCHED); InfoInferred := HasdwFileFlags(FixedFileInfo,VS_FF_INFOINFERRED); FileFunction := GetFileSubType(FixedFileInfo); END; FINALLY FreeMem(VerBuf, VerSize); END END; END END;
Comment