先说说这个问题
  我现在正测试一个C/S结构程序,更新客户端程序非常麻烦。我再在想把一些经常更新的文件放在服务器上,客户端程序启动的时候自动搜索服务器中最新的文件(如我用的是DLL,根据DLL文件版本号控制,每次自动下载版本最新的DLL文件)服务器用FTP服务,已经在IIS中配置好。虽然现在可以下在文件,但是应该在下载文件前判断它的版本号。我用的是GetFileVersionInfoSize   VerQueryValue两个API函数。但是不能得到文件的版本号。如:GetFileVersionInfoSize('ftp://192.168.1.3 :10/MMSYSTEM.DLL', Wnd)返回空值。不知通过什么途径才能得到版本号,请大侠们帮帮忙.

解决方案 »

  1.   

    给你一个函数把
    function TfrmVersion.GetVersion(FName:string):string;
    var
      InfoSize, Wnd: DWORD;
      VerBuf: Pointer;
      szName: array[0..255] of Char;
      Value: Pointer;
      Len: UINT;
      TransString:string;
    begin
      InfoSize := GetFileVersionInfoSize(PChar(FName), Wnd);
      if InfoSize <> 0 then
      begin
        GetMem(VerBuf, InfoSize);
        try
          if GetFileVersionInfo(PChar(FName), Wnd, InfoSize, VerBuf) then
          begin
            Value :=nil;
            VerQueryValue(VerBuf, '\VarFileInfo\Translation', Value, Len);
            if Value <> nil then
               TransString := IntToHex(MakeLong(HiWord(Longint(Value^)), LoWord(Longint(Value^))), 8);
            Result := '';
            StrPCopy(szName, '\StringFileInfo\'+Transstring+'\FileVersion');
                                                      //       ^^^^^^^此处换成ProductVersion得到的是"产品版本"
            if VerQueryValue(VerBuf, szName, Value, Len) then
               Result := StrPas(PChar(Value));
          end;
        finally
          FreeMem(VerBuf);
        end;
      end;
    end;
      

  2.   

    获取文件版本信息  
    type  
       TFileInfo  =  packed  record  
           CommpanyName:  string;  
           FileDescription:  string;  
           FileVersion:  string;  
           InternalName:  string;  
           LegalCopyright:  string;  
           LegalTrades:  string;  
           OriginalFileName:  string;  
           ProductName:  string;  
           ProductVersion:  string;  
           Comments:  string;  
           VsFixedFileInfo:VS_FIXEDFILEINFO;  
           UserDefineValue:string;  
       end;  
     
    function  GetFileVersionInfomation(const  FileName:  string;  var  info:  TFileInfo;UserDefine:string=''):  
       boolean;  
    const  
       SFInfo=  '\StringFileInfo\';  
    var  
       VersionInfo:  Pointer;  
       InfoSize:  DWORD;  
       InfoPointer:  Pointer;  
       Translation:  Pointer;  
       VersionValue:  string;  
       unused:  DWORD;  
    begin  
       unused  :=  0;  
       Result  :=  False;  
       InfoSize  :=  GetFileVersionInfoSize(pchar(FileName),  unused);  
       if  InfoSize  >  0  then  
       begin  
           GetMem(VersionInfo,  InfoSize);  
           Result  :=  GetFileVersionInfo(pchar(FileName),  0,  InfoSize,  VersionInfo);  
           if  Result  then  
           begin  
               VerQueryValue(VersionInfo,  '\VarFileInfo\Translation',  Translation,  InfoSize);  
               VersionValue  :=  SFInfo  +  IntToHex(LoWord(Longint(Translation^)),  4)  +  
                   IntToHex(HiWord(Longint(Translation^)),  4)  +  '\';  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'CompanyName'),  InfoPointer,  InfoSize);  
               info.CommpanyName  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'FileDescription'),  InfoPointer,  InfoSize);  
               info.FileDescription  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'FileVersion'),  InfoPointer,  InfoSize);  
               info.FileVersion  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'InternalName'),  InfoPointer,  InfoSize);  
               info.InternalName  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'LegalCopyright'),  InfoPointer,  InfoSize);  
               info.LegalCopyright  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'LegalTrades'),  InfoPointer,  InfoSize);  
               info.LegalTrades  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'OriginalFileName'),  InfoPointer,  InfoSize);  
               info.OriginalFileName  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'ProductName'),  InfoPointer,  InfoSize);  
               info.ProductName  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'ProductVersion'),  InfoPointer,  InfoSize);  
               info.ProductVersion  :=  string(pchar(InfoPointer));  
               VerQueryValue(VersionInfo,  pchar(VersionValue  +  'Comments'),  InfoPointer,  InfoSize);  
               info.Comments  :=  string(pchar(InfoPointer));  
               if  VerQueryValue(VersionInfo,  '\',  InfoPointer,  InfoSize)  then  
                   info.VsFixedFileInfo  :=  TVSFixedFileInfo(InfoPointer^);  
               if  UserDefine<>''  then  
               begin  
                   if  VerQueryValue(VersionInfo,pchar(VersionValue+UserDefine),InfoPointer,InfoSize)  then  
                       info.UserDefineValue:=string(pchar(InfoPointer));  
               end;  
           end;  
           FreeMem(VersionInfo);  
       end;  
    end;  
     
    调用演示:  
     
    procedure  TForm1.Button1Click(Sender:  TObject);  
    var  
       info:  TFileInfo;  
    begin  
       if  OpenDialog1.Execute  then  
       begin  
           if  GetFileVersionInfomation(opendialog1.FileName,  info,'WOW  Version')  then  
           begin  
               Listbox1.Items.Add(OpenDialog1.FileName);  
               ListBox1.Items.Add('Comments:'  +  info.Comments);  
               ListBox1.Items.Add('CommpanyName:'  +  info.CommpanyName);  
               ListBox1.Items.Add('FileDescription:'  +  info.FileDescription);  
               ListBox1.Items.Add('FileVersion:'  +  info.FileVersion);  
               ListBox1.Items.Add('InternalName:'  +  info.InternalName);  
               ListBox1.Items.Add('LegalCopyright:'  +  info.LegalCopyright);  
               ListBox1.Items.Add('LegalTrades:'  +  info.LegalTrades);  
               ListBox1.Items.Add('OriginalFileName:'  +  info.OriginalFileName);  
               ListBox1.Items.Add('ProductName:'  +  info.ProductName);  
               ListBox1.Items.Add('ProductVersion:'  +  info.ProductVersion);  
               ListBox1.Items.Add('UserDefineValue:'  +  info.UserDefineValue);  
               if  boolean(info.VsFixedFileInfo.dwFileFlags  and  vs_FF_Debug)  then  
                 listbox1.Items.Add('Debug:True')  
                 else  
                 ListBox1.Items.Add('Debug:False');  
               ListBox1.Items.Add('');  
           end;  
       end;  
    end;
      

  3.   

    我是想得到ftp服务器上指定DLL文件版本信息,不是本机上的文件信息.
      

  4.   

    最简单的,在ftp服务器上放一个版本说明文件,先将版本说明文件取到本地,将版本说明和本地文件比较,需要更新的话,再从ftp服务器上取就是了。
      

  5.   

    按照genhone_ru说的可以实现了。