gpt4 book ai didi

delphi - 如何在不手动操作的情况下最好地修改/安装组件库路径到 Delphi IDE 中?

转载 作者:行者123 更新时间:2023-12-03 15:50:59 25 4
gpt4 key购买 nike

我正在准备一个安装程序 ( Inno Setup ) 将我的组件包安装到 Delphi XE 中,而无需在 IDE 中手动操作。

我需要修改Delphi库路径,例如删除其中一部分(例如xxx;MyOldPath;yyy)并插入新路径xxxx;MyNewPath;yyyy 。是否有首选方法来执行此操作,或者我必须编写一个实用程序来执行此操作?

谢谢

最佳答案

修改路径是基本的字符串操作:您从注册表中读取当前路径,对其进行操作以满足您的需要,然后将其写回。

您可以编写一个 Inno Setup 脚本函数,这样您就没有任何外部依赖项。或者编写一个从 Inno Setup 的脚本中使用的 Delphi DLL,这样调试起来会更容易。

<小时/>

编辑

这是我在生产中实际使用的例程的修改版本。它将从搜索路径注册表值或浏览路径(与此相关的任何其他路径)读取整个路径列表,可能会删除一些路径,并添加一些路径(如果它们尚不存在)。

procedure UpdateDelphiPaths(const RegistryKey, RegistryValue: string; PathsToRemove, PathsToAdd: TStrings);
var R:TRegistry;
SKeys:TStringList;
Found:Boolean;
Updated:Boolean;
i,j:Integer;
s:string;
R_Globals:TRegistry;

// This function normalises paths in comparasions
function PrepPathForComparasion(const Path:string):string;
begin
if Path = '' then Result := '\'
else
if Path[Length(Path)] = '\' then
Result := LowerCase(Path)
else
Result := LowerCase(Path) + '\';
end;

function PathMatchesRemoveCriteria(const Path:string): Boolean;
var i:Integer;
begin
// This needs to be addapted to match your criteria!
for i:=0 to PathsToRemove.Count-1 do
if AnsiPos(PathsToRemove[i], Path) <> 0 then
Exit(True);
Result := False;
end;

begin
R := TRegistry.Create;
try
R.RootKey := HKEY_CURRENT_USER;
if R.OpenKey(RegistryKey + '\Library', False) then
if R.ValueExists(RegistryValue) then
begin
SKeys := TStringList.Create;
try
SKeys.Delimiter := ';';
SKeys.StrictDelimiter := True;
SKeys.DelimitedText := R.ReadString(RegistryValue);

Updated := False;

// Look at all the paths in the PathsToAdd list, if any one's missing add it to the list and mark
// "Updated".
for i:=0 to PathsToAdd.Count-1 do
begin
Found := False;
for j:=0 to SKeys.Count-1 do
if LowerCase(Trim(SKeys[j])) = LowerCase(Trim(PathsToAdd[i])) then
Found := True;
if not Found then
begin
SKeys.Add(PathsToAdd[i]);
Updated := True;
end;
end;

// Look at every single path in the current list, if it's not in the "PathsToAdd" and it matches
// a name in "PathsToRemove", drop it and mark "Updated"
i := 0;
while i < SKeys.Count do
begin
if PathMatchesRemoveCriteria(SKeys[i]) then
begin
// Path matches remove criteria! It only gets removed if it's not actually present in
// PathsToAdd
Found := False;
for j:=0 to PathsToAdd.Count-1 do
begin
if PrepPathForComparasion(SKeys[i]) = PrepPathForComparasion(PathsToAdd[j]) then
Found := True;
end;
if not Found then
begin
SKeys.Delete(i);
Updated := True;
end
else
Inc(i);
end
else
Inc(i);
end;

// If I've updated the SKeys in any way, push changes back to registry and force updates
if Updated then
begin
s := SKeys[0];
for i:=1 to SKeys.Count-1 do
if SKeys[i] <> '' then
begin
s := s + ';' + SKeys[i];
end;
R.WriteString(RegistryValue, s);

// Force delphi to re-load it's paths.
R_Globals := TRegistry.Create;
try
R_Globals.OpenKey(RegistryKey + '\Globals', True);
R_Globals.WriteString('ForceEnvOptionsUpdate', '1');
finally R_Globals.Free;
end;

end;

finally SKeys.Free;
end;
end;
finally R.Free;
end;
end;

从 Delphi 代码中,我可以像这样调用例程,以确保安装了给定库的最新搜索路径:

var ToRemove, ToAdd: TStringList;
begin
ToRemove := TStringList.Create;
try
ToAdd := TStringList.Create;
try
ToRemove.Add('LibraryName\Source');
ToAdd.Add('C:\LibraryName\Source');
UpdateDelphiPaths('Software\CodeGear\BDS\7.0', 'Test Path', ToRemove, ToAdd);
finally ToAdd.Free;
end;
finally ToRemove.Free;
end;
end;

注意 ToRemoveToAdd。我可以安全地在“删除”和“添加”列表中指定搜索路径:仅当路径匹配“删除”条件但不在“添加”列表中时才会删除路径。另请注意 PathMatchesRemoveCriteria 函数。

您可以修改代码以直接从 InnoScript 本身运行,或者您可以将代码放入 DLL 中并使用安装程序中的 DLL。 DLL变体的优点是在Delphi中很容易调试,在Inno本身上也很容易; Inno变体的优点是没有外部依赖,但需要对代码进行适配和调试。

关于delphi - 如何在不手动操作的情况下最好地修改/安装组件库路径到 Delphi IDE 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6813438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com