function GetFileVersionInfomation2(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);
  Infosize := GetFileVersionInfoSize('C:\Documents and Settings\Administrator\桌面\新建文件夹 (3)\Project1.exe',
    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;在D6中的DLL和exe中调用都没有问题,但将代码放置到D2010编译的DLL中,调用时出现了问题。将代码放到D2010的exe文件中调用正常。
在DL中,跟踪发现程序运行到红色行时,再下一步就跳到了最后一个end上了。

解决方案 »

  1.   

    默认值?字符串?WideString和String?
      

  2.   

    用的都是WideString,pchar也是pwidestring
      

  3.   

    D2010中用的是用的都是WideString,pchar也是pwidestring ,这个事D2010中默认的啊
      

  4.   

    已经解决了,问题出在 var info: TFileInfo,结构体中包含了  
    type
      TFileInfo=packed record
      CommpanyName: String;
      ......
      end;
    经过跟踪发现dll传递进来的info存在问题,没有内存分配。修改后,CommpanyName元素访问出错,没有分配内存,更改为CommpanyName array[1..1024] of char ;问题解决
    在D6中不存在这样的问题,不知为什么