我想获取特定平台(win32,win64,OSx)的库路径。
但是,当我要求提供库路径时,OTA只会将OSx库路径返回给我。
代码是:
EnvironmentOptions := (BorlandIDEServices as IOTAServices).GetEnvironmentOptions;
Paths.Text := EnvironmentOptions.Values['LibraryPath'];
我注意到一件奇怪的事。当我要求键值时,我得到3 LibraryPath。
当我做:
EnvironmentOptions.GetOptionNames
我得到:
... A lot of values
'ClassCompletionBooleanAddInterface', tkEnumeration
'LibraryPath', tkLString --> 1
'PackageDPLOutput', tkLString
... lot of values
'LibraryPath', tkLString --> 2
'PackageDPLOutput', tkLString
... lot of values
'HPPOutputDirectory', tkLString
'LibraryPath', tkLString --> 3
'PackageDPLOutput', tkLString
... lot of values
我认为每个键都必须代表我可能拥有的目标之一(win32,win64,OSx)。但是由于我只能为它的名称调用Key的值,所以它总是向我返回它找到的第一个密钥,在我的情况下是OSX。
最佳答案
我不会接受我的答案是正确的,这只是一个选择。我没有发现直接在OTA中执行此操作的可能性,因此我在注册表中进行了查找:
procedure GetLibraryPath(Paths: TStrings; PlatformName: string);
var
Svcs: IOTAServices;
Options: IOTAEnvironmentOptions;
Text: string;
List: TStrings;
ValueCompiler: string;
RegRead: TRegistry;
begin
Svcs := BorlandIDEServices as IOTAServices;
if not Assigned(Svcs) then Exit;
Options := Svcs.GetEnvironmentOptions;
if not Assigned(Options) then Exit;
ValueCompiler := Svcs.GetBaseRegistryKey;
RegRead := TRegistry.Create;
List := TStringList.Create;
try
if PlatformName = '' then
Text := Options.GetOptionValue('LibraryPath')
else
begin
RegRead.RootKey := HKEY_CURRENT_USER;
RegRead.OpenKey(ValueCompiler + '\Library\' + PlatformName, False);
Text := RegRead.GetDataAsString('Search Path');
end;
List.Text := StringReplace(Text, ';', #13#10, [rfReplaceAll]);
Paths.AddStrings(List);
if PlatformName = '' then
Text := Options.GetOptionValue('BrowsingPath')
else
begin
RegRead.RootKey := HKEY_CURRENT_USER;
RegRead.OpenKey(ValueCompiler + '\Library\' + PlatformName, False);
Text := RegRead.GetDataAsString('Browsing Path');
end;
List.Text := StringReplace(Text, ';', #13#10, [rfReplaceAll]);
Paths.AddStrings(List);
finally
RegRead.Free;
List.Free;
end;
end;