在软件自动升级软件中,需要对服务器上的文件进行比较,决定是否需要升级,据说可以通过设定软件的版本,对版本进行比较,不知怎么搞。
解决方案 »
- delphi用随机数进行数据库内表之间的传数
- 【特急】delphi 7 中combox问题!高手请进!
- 文本文件转换成excel文件,效率最快的
- 在控制台下建立了一个工程为什么运行的时候一闪而过
- delphi中如何將MENO清空,賦值
- 急!!请大家帮忙:我的Delphi6怎么打不开带有QuickReport控件的窗体了。
- 关于制作安装程序打包的问题
- 怎样以一个控件为模板,动态创建除名称外其它属性都相同的另一个控件??
- 请问*.olb是什么类型的文件?
- 1请问大家DELPHI和BCB与VC之类的比有什么特长之处呢?一般都用它们开发什么样的软件呢?20分
- D7程序转D2009问题
- 如何用MSComm1控件读取16进制的串口信息
//获得文件版本信息
procedure TForm1.Button1Click(Sender: TObject);
const
InfoNum = 9;
InfoStr: array[1..InfoNum] of string = (
'ProductName',
'ProductVersion',
'FileDescription',
'LegalCopyright',
'FileVersion',
'CompanyName',
'LegalTradeMarks',
'InternalName',
'OriginalFileName'
);
var
S: string;
BufSize, Len: DWORD;
Buf: PChar;
Value: PChar;
begin
S := Application.ExeName;
BufSize := GetFileVersionInfoSize(PChar(S), BufSize);
if BufSize > 0 then
begin
Buf := AllocMem(BufSize);
GetFileVersionInfo(PChar(S), 0, BufSize, Buf);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then
Memo1.Lines.Add (Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
Memo1.Lines.Add ( '产品版本: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
Memo1.Lines.Add ('文件说明: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
Memo1.Lines.Add ('合法版权: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
Memo1.Lines.Add ('文件版本: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
Memo1.Lines.Add ('公司名称: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
Memo1.Lines.Add ('合法商标: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
Memo1.Lines.Add ('内部名称: ' + Value);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
Memo1.Lines.Add ('原文件名: ' + Value);
FreeMem(Buf, BufSize);
end
else
begin
Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
Application.Terminate;
end;
end;
获取本机的和服务器比较.function GetFileSizeString(pFileName: String):String;
var
FileHandle: integer;
begin
Result := '';
FileHandle := FileOpen(pFileName, 0);
Result := IntToStr(FileSeek(FileHandle, 0, 2));
FileClose(FileHandle);
end;function GetVersionString(pFileName: string): string;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
Dummy: DWORD;
VerValue: PVSFixedFileInfo;
begin
Result := '0';
VerInfoSize := GetFileVersionInfoSize(PChar(pFileName), Dummy);
if VerInfoSize = 0 then
Exit;
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(pFileName), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, chr(92), Pointer(VerValue), VerValueSize);
Result := IntToStr(VerValue^.dwFileVersionMS shr 16) + '.' +
IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' +
IntToStr(VerValue^.dwFileVersionLS shr 16) + '.' +
IntToStr(VerValue^.dwFileVersionLS and $FFFF);
FreeMem(VerInfo);
end;
循环读一定大小到内存,直接比较内存也可以。for i := 1 to Cnt do
begin
Application.ProcessMessages;
FS1.Read(Buff1^, n_BlockSize);
FS2.Read(Buff2^, n_BlockSize);
Result := CompareMem(Buff1, Buff2, n_BlockSize);
if not Result then Exit;
end;