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

Inno Setup以二进制格式写日期到注册表并兼容C# DateTime读取的方法

解决方案

你在MFC中使用的DATE类型本质是OLE自动化日期,存储为8字节双精度浮点数,C#可以直接通过DateTime.FromOADate()方法解析该格式,因此只要按这个规则写入二进制数据即可满足两端读写兼容的需求。

1. Inno Setup 写入逻辑

你需要在[Code]段实现以下逻辑:先判断目标注册表值是否存在,不存在的话将当前系统时间转换为OLE日期格式的8字节二进制数据,再调用RegWriteBinaryValue写入即可。
示例代码:

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  RegPath: string;
  RegValueName: string;
  OleDate: Double;
  DateBytes: array of Byte;
  I: Integer;
begin
  // 安装完成后执行操作
  if CurStep = ssPostInstall then
  begin
    // 替换为你实际使用的公共程序数据注册表路径、值名
    RegPath := 'SOFTWARE\你的公司名\你的产品名';
    RegValueName := 'InstallDate';
    
    // 仅当值不存在时写入
    if not RegValueExists(HKEY_LOCAL_MACHINE, RegPath, RegValueName) then
    begin
      // 获取当前时间对应的OLE日期(和MFC DATE格式完全一致)
      OleDate := Now;
      // 将8字节Double转换为字节数组
      SetLength(DateBytes, 8);
      for I := 0 to 7 do
        DateBytes[I] := GetByte(OleDate, I);
      // 写入二进制注册表值
      RegWriteBinaryValue(HKEY_LOCAL_MACHINE, RegPath, RegValueName, DateBytes);
    end;
  end;
end;

注:如果你的注册表项需要32位/64位视图适配,可以在注册表操作函数的根键参数里加上对应视图标识,比如HKEY_LOCAL_MACHINE_64或HKEY_LOCAL_MACHINE_32。

2. C# 读取逻辑

直接读取对应REG_BINARY值,转换为双精度浮点数后调用DateTime.FromOADate即可得到正确的时间对象:

using Microsoft.Win32;

// 替换为实际的注册表路径、值名
const string RegPath = @"SOFTWARE\你的公司名\你的产品名";
const string RegValueName = "InstallDate";

using (var key = Registry.LocalMachine.OpenSubKey(RegPath, false))
{
    if (key != null)
    {
        byte[] dateBytes = key.GetValue(RegValueName) as byte[];
        if (dateBytes != null && dateBytes.Length == 8)
        {
            double oleDate = BitConverter.ToDouble(dateBytes, 0);
            DateTime installDate = DateTime.FromOADate(oleDate);
            // 后续使用installDate即可
        }
    }
}

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:39:03