You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 64位Debug与Release配置差异致版本获取异常排查

问题原因与解决方案

核心代码错误

你的代码中VerQueryValue的第三个参数传递错误,导致未定义行为:

// 错误写法
VerQueryValue(buffer, '\', pointer(pinfo), len)
// 正确写法
VerQueryValue(buffer, '\', @pinfo, len)

VerQueryValue的第三个参数需要接收指向指针的指针(用来存储找到的VS_FIXEDFILEINFO结构地址),而你传递的是pointer(pinfo)——也就是pinfo变量当前的未初始化值(随机内存地址),而非pinfo变量自身的地址。

64位Debug与Release的差异影响

这个错误在不同编译配置下表现不同,核心源于以下差异:

  • 内存初始化策略:Debug模式下,Delphi会自动将未初始化的局部变量填充为固定值(64位下是$CCCCCCCCCCCCCCCC),这个值恰好是一个无效但不会触发立即崩溃的地址,且在某些情况下,VerQueryValue的错误调用碰巧能覆盖到正确的内存区域(比如栈上的pinfo变量位置),从而返回正确结果。
  • 编译器优化:64位Release模式下开启了全量优化,编译器会重排代码、调整变量的内存布局,同时不会对未初始化变量做填充。此时错误的VerQueryValue调用会将结构地址写入随机的内存区域,导致pinfo指向无效或错误的内存块,读取到的dwFileVersionLS自然是随机垃圾值。
  • 栈帧布局:Debug模式会生成完整的栈帧用于调试,变量的位置相对固定;Release模式会省略栈帧优化,变量的内存位置更紧凑且不固定,加剧了错误调用的不可预测性。

额外代码问题修复

除了VerQueryValue的参数错误,你的代码还有一个潜在风险:buffer变量在size=0时未被初始化,直接进入finally块执行FreeMem(buffer)会触发内存访问错误。需要调整代码逻辑:

procedure Tform1.FormCreate(Sender: TObject);
var
  vMajor, vMinor, vRelease, vBuild: DWord;
  size, len: longword;
  handle: DWord;
  buffer: pchar;
  pinfo: ^VS_FIXEDFILEINFO;
begin
  buffer := nil; // 初始化buffer为nil
  try
    size := GetFileVersionInfoSize(PWideChar(Application.ExeName), handle);
    if size > 0 then begin
      GetMem(buffer, size);
      if GetFileVersionInfo(PWideChar(Application.ExeName), 0, size, buffer) then begin
        if VerQueryValue(buffer, '\', @pinfo, len) then begin
          vMajor   := HiWord(pinfo.dwFileVersionMS);
          vMinor   := LoWord(pinfo.dwFileVersionMS);
          vRelease := HiWord(pinfo.dwFileVersionLS);
          vBuild   := LoWord(pinfo.dwFileVersionLS);
        end;
      end;
    end;
  finally
    if Assigned(buffer) then FreeMem(buffer); // 仅当buffer已分配时释放
  end;
end;

另外,Application.ExeName是Unicode字符串,直接转Pointer不够严谨,建议显式转PWideChar以匹配Windows API的Unicode版本调用。

内容的提问来源于stack exchange,提问作者Dave C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:02:10