Entsorge das StringReplace für die Umgebungsvariablen, denn das ist Unsinn - wer sagt, dass dort immer %SystemRoot% steht? Nutze stattdessen das schon erwähnte ExpandEnvironmentStrings. Dann würde ich nie mit festen Längen arbeiten, um an den Icon-Index zu kommen sondern mich immer an dem Komma orientieren, denn es gibt keine feste Länge für Ressourcen-Indices! Und wie gesagt: für String-Ressourcen ist SHLoadIndirectString erheblich einfacher; hier mal mein "Wrapper" dafür:
Delphi-Quellcode:
function SHLoadIndirectString(pszSource, psuOutBuf: PWideChar; const ccOutBuf: UINT; var ppvReserved: Pointer): HRESULT; stdcall; external SHLWAPIDLL;
implementation
function _SHLoadIndirectString(const AIndirectStr: WideString): WideString;
var
Lbuf: array[0..4095] of WideChar;
begin
ZeroMemory(@Lbuf, SizeOf(Lbuf));
if SHLoadIndirectString(PWideChar(AIndirectStr), Lbuf, Length(Lbuf), Pointer(nil^)) = S_OK then
Result:= WideString(Lbuf)
else
RaiseLastOsError;
end;
Beispielaufruf (mit sinnloser Zwischenvariable, damit der Code mehrzeilig wird, weil das Forum Einzeiler nicht in einen vollständigen Codeblock packt):
Delphi-Quellcode:
var s: WideString;
s:= _SHLoadIndirectString('@%SystemRoot%\System32\AudioSrv.Dll,-202');
ShowMessage(s);
Grüße
Dalai