//自定义读文件版本信息的函数
function TForm1.GetFileVerInfo(FileName:string):TStrings;
const
    InfoNum = 9;
    InfoStr: array[1..InfoNum] of string =(
                                           'ProductName',
                                           'ProductVersion',
                                           'FileDescription',
                                           'LegalCopyright',
                                           'FileVersion',
                                           'CompanyName',
                                           'LegalTradeMarks',
                                           'InternalName',
                                           'OriginalFileName'
                                          );
var
    Buf: PChar;
    BufSize,Len: DWORD;
    Value: PChar;
    StringList:TStrings;
begin
    StringList:=TStringList.Create;
    BufSize := GetFileVersionInfoSize(PChar(FileName),BufSize);
    if BufSize > 0 then
       begin
         Buf := AllocMem(BufSize);
         GetFileVersionInfo(PChar(FileName),0,BufSize,Buf);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value),Len)  then  StringList.Add('产品名称: '+ Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then  StringList.Add('产品版本: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then  StringList.Add('文件说明: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then  StringList.Add('合法版权: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then  StringList.Add('文件版本: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then  StringList.Add('公司名称: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then  StringList.Add('合法商标: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then  StringList.Add('内部名称: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then  StringList.Add('原文件名: ' + Value);
         FreeMem(Buf, BufSize);
      end
    else StringList.Add('无版本信息......OK');
    Result:=StringList;
    StringList.Free;
end;
//=======================================================================//调用上面的函数
procedure TForm1.Button1Click(Sender: TObject);
var
   List:TStrings;
begin
   List:=TStringList.Create;
   List:=GetFileVerInfo(Application.ExeName);
   Memo1.Lines.AddStrings(List); //在这里出错,请帮我,我就50分了
   List.Free;
end;

解决方案 »

  1.   

    因为你在GetFileVerInfo中将StringList.Free,去掉StringList.Free或向GetFileVerInfo传一TStrings变量保存返回值。
      

  2.   

    呵呵,TStrings是类,类都是引用类型,不是值类型,因为你StringList.Free意味着这个类被释放了,而你在以后的代码中又去引用一个被你释放掉的类,肯定要出错的,建议你把函数原型修改成:
    function TForm1.GetFileVerInfo(FileName:string; var R: TStrings):Boolean;在这个函数中不要对R进行Free的操作,在你真正用完后再释放。
      

  3.   

    多谢tlihui(阿南)、wolf2005() 、sundayboysII(空)