2016-08-08 5 views
2

特定のプラットフォーム(win32、win64、OSx)のライブラリパスを取得します。 しかし、私がライブラリパスを求めるとき、OTAは私にOSxライブラリパスを返すだけです。OTAを使用して特定のプラットフォームのライブラリパスを返します

コードは次のとおりです。

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)を持っている可能性目標の一つを表している必要がありますと思います。しかし、私はちょうどそれの名前のためのキーの値を呼び出すことができるように、それは常に私には、OS Xの私の場合は、私の場合は、最初のキーを返します。

+0

otapiタグとtoolsapiタグを追加しました。私はこれらをマージすることができると思うが、私はこれらのタグに十分なスコアがなく、提案をしていない。 –

+0

それは奇妙です:)ありがとうございます –

答えて

3

私は正しいと私の答えを受け入れることはありませんオプション。私は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; 
+0

それは動作しますか?ああ、 'GetBaseRegistryKey'に感謝します。私はこれを知らなかったし、今すぐ書いているコードに便利だ。とても便利な。 –

+0

良い:)はい、それは働いた:) –

+0

あなたは自分で答えを見つけるためのupvoteを取得します。とても良い!おそらく、あなたが望む値を取得する*唯一の方法です。うーん... 'IOTAEnvironmentOptions.Values []'が重複したキーを返すのは良くありません。それらは異なるプラットフォーム、IMOのために異なって命名されるべきです。例えば。 '' LibraryPathMacOS''など –

関連する問題