我用Delphi7做了一个Assist.exe,我在Project->Options里面设置了发布的版本号,我能否在这个程序内部获取自己的版本号,从而判断是否旧版本?
解决方案 »
- 一个有关dbgrideh的小问题?
- 电信级数据库操作问题。
- 关于MenuSpeedButton和数据库的问题
- 如何保存DBGRID中的记录
- delphi中 ACTION 方法,怎么用,什么时用适合。有经验的指点一下,谢了。
- 怎样在odbc中自动创建一个数据源并指向一个access数据库
- 求一个加密的构件
- 关于类的申明!!!
- Delphi项目管理人员请进入——delphi团队开发问题(续)
- 错误Project xx.exe raiseed exception calss Eaccessviolation with message 'Access Violntion at address' B03F511 in module' msjet4
- 奇怪使用self.adoq.next 可用 frmDDDD.adoq.next 就不可用?
- NewID()的赋值问题
function GetVersionCheck(FileDir: string): string;
var
Dlen:Dword;
Dsize:Dword;
PDatA:pointer;
block:^VS_FIXEDFILEINFO ;
begin
DLen:=GetFileVersioninfoSize(Pchar(filedir),Dsize);
if DLen<>0 then
begin
GetMem(Pdata,Dlen);
try
if GetFileVersionInfo(pchar(FileDir),Dsize,Dlen,Pdata) then
begin
Block:=nil;
VerQueryValue(pdata,'\',pointer(Block),dsize);
if Block<>nil then
begin
Result:=Format('%d.%d.%d.%d',[Block^.dwFileVersionMS shr 16,
block^.dwFileVersionMS and $0000ffff,
block^.dwFileVersionLS shr 16,
block^.dwFileVersionLS and $0000ffff]); end;
end;
FINALLY
freemem(pdata,DLEN);
end;
end;
end;
var
InfoSize, unuse: DWORD;
VerBuf: Pointer;
FI: PVSFixedFileInfo;
VerSize: DWORD;
MajorMinor,ReleaseBuild :DWORD;
begin
unuse :=0;
MajorMinor := 0;//Major,Minor 如:00010001代表1.1
ReleaseBuild := 0;//Release,Build 如00121208代表12.1208 则版本为1.1.12.1208
result :='unknown';
InfoSize := GetFileVersionInfoSize(PChar(FileName), unuse);
if InfoSize <> 0 then
begin
GetMem(VerBuf, InfoSize);
try
if GetFileVersionInfo(PChar(FileName), unuse, InfoSize, VerBuf) then
if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then
begin
MajorMinor := FI.dwFileVersionMS;
ReleaseBuild := FI.dwFileVersionLS;
end;
finally
FreeMem(VerBuf);
end;
result :=IntToStr(MajorMinor shr 16) + '.' + IntToStr(MajorMinor and $ffff) + '.' + IntToStr(ReleaseBuild shr 16) + '.' + IntToStr(ReleaseBuild and $ffff);
end;
end;
var
X:Int64;
begin
x := LongLong(time_in) * 10000000 + 116444736000000000;//$19db1ded53ea710;
pft^.dwHighDateTime := DWORD((x shr 32) and $0ffffffff);
pft^.dwLowDateTime := DWORD(x and $0ffffffff);
end;function UinxTime_2_FileTime_String(const time_in:DWORD):String;inline;
var
ft:FILETIME;
st:SYSTEMTIME;
begin
UnixTime_2_FileTime(time_in,@ft);
FileTimeToLocalFileTime(ft,ft);
FileTimeToSystemTime(ft,st);
result := FormatDateTime(' (yyyy.mm.dd hh:nn:ss)',SystemTimeToDateTime(st));end;
function GetVersion: string;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
Result := '0.0.0.0'; VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
dwProductVersionMS := dwFileVersionMS;
dwProductVersionLS := dwFileVersionLS;
Result :=Format('%d.%d.%d.%d', [
dwProductVersionMS shr 16,
dwProductVersionMS and $FFFF,
dwProductVersionLS shr 16,
dwProductVersionLS and $FFFF
]);
end;
end;
function TFrmAbout.GetFileDate(FileName: String;var FileDate:String): Boolean;
type _IMAGE_RESOURCE_DIRECTORY = record
Characteristics: DWORD;
TimeDateStamp: DWORD;
MajorVersion: WORD;
MinorVersion: WORD;
NumberOfNamedEntries :WORD;
NumberOfIdEntries: WORD;
// IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
end;
IMAGE_RESOURCE_DIRECTORY = _IMAGE_RESOURCE_DIRECTORY;
TIMAGERESOURCEDIRECTORY = _IMAGE_RESOURCE_DIRECTORY;
PIMAGE_RESOURCE_DIRECTORY = ^IMAGE_RESOURCE_DIRECTORY;
PIMAGERESOURCEDIRECTORY = ^TIMAGERESOURCEDIRECTORY; _IRDE_NAME = record
case Integer of
0:
//struct {
// DWORD NameOffset:31;
// DWORD NameIsString:1;
// };
(NameOffset: DWORD);
1: (Name: DWORD);
2: (Id: Word);
end;
_IRDE_OFFSET_DATA = record
case Integer of 0:(OffsetToData: DWORD);
//struct {
// DWORD OffsetToDirectory:31;
// DWORD DataIsDirectory:1;
//};
1:(Directory: DWORD);
end;
_IMAGE_RESOURCE_DIRECTORY_ENTRY = record
IRDE_NAME: _IRDE_NAME;
IRDE_OFFSET_DATA: _IRDE_OFFSET_DATA;
end;
IMAGE_RESOURCE_DIRECTORY_ENTRY = _IMAGE_RESOURCE_DIRECTORY_ENTRY;
PIMAGE_RESOURCE_DIRECTORY_ENTRY = ^IMAGE_RESOURCE_DIRECTORY_ENTRY;
TIMAGERESOURCEDIRECTORYENTRY = IMAGE_RESOURCE_DIRECTORY_ENTRY;
PIMAGERESOURCEDIRECTORYENTRY = TIMAGERESOURCEDIRECTORYENTRY;
const
INVALID_SET_FILE_POINTER = DWORD(-1);
var
hFileSource: THandle;
dwSourceSize, byte_write: Cardinal;
pFileSource: PChar; dosHeadA: PImageDosHeader;
ntHeadA: PIMAGENTHEADERS ;
begin
Result := false;
//打开文件
hFileSource := CreateFile( PChar(FileName),
GENERIC_READ,
FILE_SHARE_READ ,
Nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE or
FILE_ATTRIBUTE_HIDDEN or
FILE_ATTRIBUTE_NORMAL or
FILE_ATTRIBUTE_SYSTEM,
0
); if (hFileSource = INVALID_HANDLE_VALUE) then begin
Exit;
end;
dwSourceSize := GetFileSize(hFileSource,Nil);
if (dwSourceSize = INVALID_FILE_SIZE) then begin
CloseHandle(hFileSource);
exit;
end; byte_write := 0;
//讀取
pFileSource := HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,dwSourceSize);
if (pFileSource = Nil) then begin
CloseHandle(hFileSource);
Exit;
end;
if (INVALID_SET_FILE_POINTER = SetFilePointer(hFileSource,0,NIL,FILE_BEGIN)) then begin
HeapFree(GetProcessHeap,0, pFileSource);
CloseHandle(hFileSource);
Exit;
end;
if(Not ReadFile( hFileSource, pFileSource^,dwSourceSize,byte_write,Nil)) then begin
HeapFree(GetProcessHeap,0, pFileSource);
CloseHandle(hFileSource);
Exit;
end;
if (StrLIComp( pFileSource,'MZ',2)<>0) then begin
HeapFree(GetProcessHeap,0, pFileSource);
CloseHandle(hFileSource);
Exit;
end; dosHeadA :=PImageDosHeader(pFileSource); //DOS Header ntHeadA := PIMAGENTHEADERS (PChar(Cardinal(pFileSource) + Cardinal( dosHeadA^._lfanew))); //NT Header
if (ntHeadA^.Signature <> $4550) then begin
HeapFree(GetProcessHeap,0, pFileSource);
CloseHandle(hFileSource);
Exit;
end; FileDate := UinxTime_2_FileTime_String(ntHeadA^.FileHeader.TimeDateStamp);
Result := true;
CloseHandle(hFileSource);
HeapFree(GetProcessHeap,0, pFileSource);
end;version.Caption := 'Version:' + GetVersion + Filedate;