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
相关产品推荐
相关产品推荐

