Inno Setup 不会创建所有 ODBC REG 键

Inno Setup Doesn't Create All ODBC REG Keys

所以我一直在使用注册表在 Inno 中创建 ODBC 连接。我一直 运行 关注的问题是 Inno 不会创建我设置的所有密钥。我正在使用 64 位版本的 Windows 并使用 32 位 Inno 安装程序安装 32 位应用程序。我使用的路径是HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI

示例: 我有一个包含以下值的连接 TESTDBF1: TESTDBF1

这会在 32 位 ODBC 管理器中创建连接,但我还需要指定显示的自定义 dBase 版本 (IV) 和目录 (C:\DIR)。为此,必须添加以下子项,否则 ODBC 管理员将只显示默认的 dBase 版本 (V) 和当前目录。

This Xbase directory is needed to hold the custom settings specified in the main TESTDBF1 section

The keys in the Xbase directory.

此外,我将名称:TESTDBF1 作为字符串 "Driver do Microsoft dBase (*.dbf)" 添加到 WOW6432Node\ODBC\ODBC.INI\ODBC 数据源中。

为了 运行 所有这些命令,我​​创建了 TESTDBF1.reg 以确认功能。


    Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1]
"Driver"="C:\WINDOWS\system32\odbcjt32.dll"
"DefaultDir"="C:\IBS"
"DriverId"=dword:00000115
"FIL"="dBase IV;"
"SafeTransactions"=dword:00000000
"UID"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines]

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase]
"CollatingSequence"="ASCII"
"Deleted"=hex:00
"ImplicitCommitSync"=""
"PageTimeout"=dword:00000005
"Statistics"=hex:00
"Threads"=dword:00000003
"UserCommitSync"="Yes"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\ODBC Data Sources]
"TESTDBF1"="Driver do Microsoft dBase (*.dbf)"

根据 merging/running 这个文件,所有键都已成功创建,我可以确认自定义值显示在 ODBC 管理器中。

所以,我在想 - 嘿它的工作!现在我可以添加到 Inno 中了! 不。 我使用 Inno Script Studio 作为我的编译器。 我将刚刚使用的注册表文件 TESTDBF1.reg 导入脚本,然后 运行 安装程序。没有这样的运气。 \WOW6432Node\ODBC\ODBC.INI\TESTDBF1 中的所有键均已创建,但以下子目录的 none 已创建(\Engines 和 \Engines\Xbase) ODBC 中的自定义信息。INI\TESTDBF1 打开 ODBC 管理器时保留。

所以在确认 TESTDBF1.reg 再次工作后,我查看了我在 Inno 中编写的代码:

; Imported Registry File: "C:\Users\Support\Documents\test\TESTDBF1.reg"
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: string; ValueName: "Driver"; ValueData: "C:\WINDOWS\system32\odbcjt32.dll"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: string; ValueName: "DefaultDir"; ValueData: "C:\DIR"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: dword; ValueName: "DriverId"; ValueData: "[=11=]000115"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: string; ValueName: "FIL"; ValueData: "dBase IV;"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: dword; ValueName: "SafeTransactions"; ValueData: "[=11=]000000"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: string; ValueName: "UID"; ValueData: ""; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: string; ValueName: "CollatingSequence"; ValueData: "ASCII"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: binary; ValueName: "Deleted"; ValueData: "00"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: string; ValueName: "ImplicitCommitSync"; ValueData: ""; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: dword; ValueName: "PageTimeout"; ValueData: "[=11=]000005"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: binary; ValueName: "Statistics"; ValueData: "00"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: dword; ValueName: "Threads"; ValueData: "[=11=]000003"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1\Engines\Xbase; ValueType: string; ValueName: "UserCommitSync"; ValueData: "Yes"; Flags: uninsdeletekey;
Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\ODBC Data Sources; ValueType: string; ValueName: "TESTDBF1"; ValueData: "Driver do Microsoft dBase (*.dbf)"; Flags: uninsdeletekey;

嗯。我找不到任何问题。我一次又一次地使用不同的名称、目录等 运行 安装脚本,无论我做什么,我都无法从安装脚本内部获取要写入的 \Engines\Xbase 键。

现在,为什么我不 运行 安装结束时的 .reg 文件?

因为我的部分脚本使用安装目录(会更改)作为这些注册表项的一部分。注意值数据。示例:

Root: HKLM; Subkey: SOFTWARE\WOW6432Node\ODBC\ODBC.INI\TESTDBF1; ValueType: string; ValueName: "DefaultDir"; ValueData: "{app}\IBS"; Flags: uninsdeletekey;

运行安装程序后,这是在 HKLM\Software\WOW6432Node\ODBC\ODBC 中创建的密钥。INI\TESTDBF1

Post Install Key

任何帮助将不胜感激 - 我现在很困惑。

我想我明白了 - posting 几分钟后。 post 可能有助于把事情弄清楚。

所以 - 当使用 32 位应用程序和 32 位安装程序编写 32 位密钥时,得到这个 - 你写入 64 位注册表目录。你不要写到 WOW6432Node 因为 Inno 的任何后端东西。它只是不写。

您必须写入 64 位目录,Inno 和 Windows 会以某种方式在某个地方进行通信,并会自动获取您的 32 位信息并将其放入 WOW6432Node 中。你只是不能自己做。

所以我的实际解决方法是将我所有的注册条目更改为 HKLM\SOFTWARE\ODBC\ODBC.INI\testdbf1etc 并且在这样做时,一切正常并正确写入 HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI\testdbf1etc.

我真的希望这部分能在 Inno 中得到更好的记录。如果您还记得上面的内容,我的 .reg 文件可以正常工作! Inno 是那个不会正确编写密钥的人,但我想这是可以预料的,因为它是一个应用程序而不是引用默认的 Windows 函数。

希望对大家有所帮助!