由于我现在想在进行软件版本升级时想使用户在使用时只能用新的版本(旧的版本不能使用),因此就要获得软件的版本号来区别,现在我的问题就是怎样来提取软件的版本号并使得用户只能有新的版本

解决方案 »

  1.   

    一般在一个ini文件中记录着软件的版本,升级后就更改相应的值与之对应
      

  2.   

    http://www.yesky.com/SoftChannel/72342371928440832/20031111/1743541.shtmlconst
    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 beginBuf := AllocMem(BufSize);
    GetFileVersionInfo(PChar(S), 0, BufSize, Buf);
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then
    ProductName.Caption := Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
    ProductVersion.Caption := '产品版本: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
    FileDescription.Caption := '文件说明: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
    LegalCopyright.Caption := '合法版权: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
    FileVersion.Caption := '文件版本: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
    CompanyName.Caption := '公司名称: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
    LegalTrades.Caption := '合法商标: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
    InternalName.Caption := '内部名称: ' + Value;
    if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
    OriginalFilename.Caption := '原文件名: ' + Value;
    FreeMem(Buf, BufSize);// OperatingSystem.Caption := GetOSVerInfo;// SystemMemory.Caption := GetMemStat;
    end
    else begin
    Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
    Application.Terminate;
    end;
      

  3.   

    是可以的,跟api有关,可以取得你的程序的内部编译版本,我见过,但是不会。
      

  4.   

    為什麼不看看我的代碼???如果邊我的代碼都看不懂, 你又如何有能力做到
    >>现在我的问题就是怎样来提取软件的版本号并使得用户只能有新的版本
    這個更難!!!
      

  5.   

    我看了,你那个代码好象BufSize 总是为0,能不能说说什么原因
      

  6.   

    function GetBuildInfo: string;var  VerInfoSize: DWORD;  VerInfo: Pointer;  VerValueSize: DWORD;  VerValue: PVSFixedFileInfo;  Dummy: DWORD;  V1, V2, V3, V4: Word;begin  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);  if VerInfoSize = 0 then begin    Dummy := GetLastError;    Result := '0.0.0.0';  end; {if}  GetMem(VerInfo, VerInfoSize);  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);  with VerValue^ do begin    V1 := dwFileVersionMS shr 16;    V2 := dwFileVersionMS and $FFFF;    V3 := dwFileVersionLS shr 16;    V4 := dwFileVersionLS and $FFFF;  end;  Result := IntToStr(V1) + '.'    + IntToStr(V2) + '.'    + IntToStr(V3) + '.'    + IntToStr(V4);  FreeMem(VerInfo, VerInfoSize);end;