![]() |
Parsen von EnvironmentPath
Wie würdet ihr vorgehen um den EnvironmentPath zu parsen..?
bsp. IExplorer setzt seinen Arbeitspfad mit %HOMEDRIVE%%HOMEPATH%.. Den Path stelle ich dann so zur Verfügung. @%HOMEDRIVE%@%HOMEPATH% Danach parse ich es auf diese weise.
Delphi-Quellcode:
function TShortCut.ExpandEnvironment(EnvironmentPath: PWideChar): PWideChar;
var lpDest: array [0 .. 32768] of WideChar; begin result := ''; FillChar(lpDest, SizeOf(lpDest), 0); if ExpandEnvironmentStrings(PWideChar(EnvironmentPath), lpDest, 32767) <> 0 then result := lpDest; end;
Delphi-Quellcode:
Das scheint mir irgendwie zu unsicher..
var
SplitID: TSplitStrArray; sTmpWork: WideString; begin sWorkDir := GetExePath(Trim(ParseThis(sBF, ',', 3)), ExtractFilePath(sShellTo)); SplitID := Split(sWorkDir, '@'); if (Length(SplitID) > 1) then begin if (MidStr(SplitID[1], 0, 1) = '%') then begin sTmpWork := SplitID[1]; sWorkDir := ExpandEnvironment(PWideChar(sTmpWork)); if Length(SplitID) > 1 then begin sTmpWork := SplitID[2]; sWorkDir := sWorkDir + ExpandEnvironment(PWideChar(sTmpWork)) + '\'; end; end; end; end; Könnte ja theoretisch auch nur %HOMEDRIVE% bzw. 3 aneinanderhängende enthalten sein. Um was es mir geht, suche eine bessere\sichere Lösung den EnvironmentPath zu parsen. Vielleicht hat ja jemand eine bessere Lösung. Eventuell über eine schleife oder TStringListe? gruss |
AW: Parsen von EnvironmentPath
Ich nutze eine Unit von Delphidabbler für Environment Parsing.
Wenn Dich das Interessieren sollte, ![]() |
AW: Parsen von EnvironmentPath
Ich nutze überhaupt nicht die Environment-Variablen, sondern die API-Funktion SHGetSpecialFolderLocation.
Meine Funktion sieht so aus (irgendwo mal aus dem Internet gefischt und angepasst):
Delphi-Quellcode:
Eine Liste der CSIDL-Werte ist hier zu finden:
function GetSpecialPath(aCSIDL : Integer) : String;
var shellMalloc: IMalloc; ppidl: PItemIdList; begin ppidl := nil; try if SHGetMalloc(shellMalloc) = NOERROR then begin SHGetSpecialFolderLocation(Application.Handle, aCSIDL, ppidl); SetLength(Result, MAX_PATH); if not SHGetPathFromIDList(ppidl, PChar(Result)) then begin Result := ''; end else begin SetLength(Result, lStrLen(PChar(Result))); end; end; finally if ppidl <> nil then begin shellMalloc.free(ppidl); end; end; end; ![]() In deinem Fall müsste es wohl CSIDL_PROFILE sein. |
AW: Parsen von EnvironmentPath
Warum so kompliziert? Laut der Doku
![]() Zitat:
Delphi-Quellcode:
in einem übergeben.
'%HOMEDRIVE%%HOMEPATH%'
BTW: Wer mit PWideChar arbeitet sollte auch konsequenterweise mit ExpandEnvironmentStringsW arbeiten, sonst ist bei der nächsten Umstellung (wie bei ANSI auf Unicode) das Geschrei wieder riesengross. PS: So würde diese Funktion bei mir aussehen:
Delphi-Quellcode:
function ExpandEnvironment( const AInput: string ): string;
var lResult: Cardinal; begin lResult := Winapi.Windows.ExpandEnvironmentStrings( PChar(AInput), nil, 0 ); if lResult = 0 then RaiseLastOSError( ); SetLength( Result, lResult ); lResult := Winapi.Windows.ExpandEnvironmentStrings( PChar(AInput), PChar( Result ), lResult ); if lResult = 0 then RaiseLastOSError( ); SetLength( Result, lResult - 1 ); end; |
AW: Parsen von EnvironmentPath
Ein wenig gekürzt bei gleicher funktionsweise abgesehen vom Errorcheck
Delphi-Quellcode:
edit
function ExpandEnvironment(const AInput: string): string;
const MAXSIZE = 32768; begin SetLength(Result, MAXSIZE); SetLength(Result, ExpandEnvironmentStrings(PChar(AInput), @Result[1], Length(Result)) - 1); end; Wobei mir Jasoculs Vorschlag in diesen Zusammenhang auch besser gefällt. |
AW: Parsen von EnvironmentPath
Zitat:
Danke an alle werde es mal umsetzen.. Zitat:
Die übergabe des Arbeitspfad ist nun mal von MS festgelegt die da lautet %HOMEDRIVE%%HOMEPATH% und hat nichts mit einer CSIDL zu tun. Es geht nicht darum was ich gern möchte sondern was vorgegeben ist.
Code:
zu
"c:\program files (x86)\internet explorer\iexplore.exe, IExplorer, @PATH@UserIcon\48x48\IExplorer.png, @PATH@, , 1"
Code:
gruss
"c:\program files (x86)\internet explorer\iexplore.exe, IExplorer, @PATH@UserIcon\48x48\IExplorer.png, %HOMEDRIVE%%HOMEPATH%, , 1"
|
AW: Parsen von EnvironmentPath
Zitat:
Wenn man ExpandEnvironmentStrings('%HOMEDRIVE%%HOMEPATH%') aufruft, bekommt man doch schon direkt das richtige Ergebnis (bei Bedarf vielleicht noch einen Backslash anhängen). |
AW: Parsen von EnvironmentPath
Zitat:
|
AW: Parsen von EnvironmentPath
Zitat:
Ich habe "@" angehängt um '%HOMEDRIVE%%HOMEPATH%' besser parsen zu können. Bei split wären das 3 einträge die da wären 0 = "", 1 = "C:" 2 = User\Name. Ich habe vorher nicht gewusst das man die Environment komplett übergeben kann bei mir kam da Kauderwelsch zu Stande deshalb der Umweg über Split. Wenn ich über "%" gesplittet hätte wäre das noch umständlicher weil mir dann "%" in den Strings gefehlt hätte. Zitat:
gruss |
AW: Parsen von EnvironmentPath
So geht's jetzt!
Delphi-Quellcode:
function TShortCut.ExpandEnvironment(EnvironmentPath: PWideChar): PWideChar;
var lpDest: array [0 .. 32768] of WideChar; begin result := ''; FillChar(lpDest, SizeOf(lpDest), 0); if ExpandEnvironmentStringsW(PWideChar(EnvironmentPath), lpDest, 32767) <> 0 then result := lpDest; end;
Delphi-Quellcode:
Danke für die Hilfe
sTmpWork := GetExePath(Trim(ParseThis(sBF, ',', 3)), ExtractFilePath(sShellTo));
if sTmpWork > '' then begin SplitID := Split(sTmpWork, '\'); if LeftStr(SplitID[High(SplitID)], 1) = '%' then sWorkDir := ExpandEnvironment(PWideChar(SplitID[High(SplitID)] + '\')) else sWorkDir := sTmpWork; end else sWorkDir := sTmpWork; gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz