![]() |
AW: Das Handle ist ungültig
Ich habe diesen String in Einzelteile zerlegt und möchte gerne wissen wie ihr das machen würdet.
'@%SystemRoot%\System32\AudioSrv.Dll,-203' @%SystemRoot% soll mit dem Pfad zum Aktuellen Windows Order ersetzt werden. und eine Variable DWORD für die ID 203 angelegt werden (extrahiert aus dem String natürlich.) Ich habe es fertig wie man im Bild sehen kann aber mich interessiert wie ihr das macht und vor allem mit welchem Aufwand. gruss |
AW: Das Handle ist ungültig
Zitat:
![]() Eine manuelle Verarbeitung - die ich nur für Nicht-String-Ressourcen machen würde - würde ich so angehen: das @ entfernen, ![]() Grüße Dalai |
AW: Das Handle ist ungültig
Zitat:
Das scheint mir sehr viel Aufwand.. deshalb meine Frage.
Delphi-Quellcode:
procedure TAudioVolume.LoadDisplayNamefromDLL(DisplayName: PWideChar);
var Module: HModule; Root: string; Filename: string; StrID: string; ID: DWORD; Buffer : array [0..MAX_PATH] of WideChar; begin // GetRootPath SetLength(Root, MAX_PATH); SetLength(Root, GetWindowsDirectory(PWideChar(Root), Length(Root))); // Replace '%SystemRoot%' with Root Filename := StringReplace(DisplayName, '%SystemRoot%', root, [rfReplaceAll]); // Remove First @ Letter Filename := MidStr(Filename, 2, Length(Filename)); // Extract ID StrID := MidStr(Filename, Length(Filename) - 2, 4); ID := StrToInt(StrID); Filename := LeftStr(Filename, Length(Filename) - 5); // Load the Lib Module := LoadLibraryExW(PWideChar(Filename), 0, LOAD_LIBRARY_AS_DATAFILE); // check for error if Module <> INVALID_HANDLE_VALUE then begin LoadString(Module, ID, @Buffer, MAX_PATH); FAudioSessionList.DisplayName := String(Buffer); if Module <> 0 then FreeLibrary(Module); end; end;
Delphi-Quellcode:
gruss
procedure TAudioVolume.LoadIconPathfromResource(IconPath: PWideChar);
var Module: HModule; Root: string; Filename: string; StrID: string; ID: DWORD; begin // GetRootPath SetLength(Root, MAX_PATH); SetLength(Root, GetWindowsDirectory(PWideChar(Root), Length(Root))); // Replace '%SystemRoot%' with Root Filename := StringReplace(IconPath, '%SystemRoot%', root, [rfReplaceAll]); // Remove First @ Letter Filename := MidStr(Filename, 2, Length(Filename)); // Extract ID StrID := MidStr(Filename, Length(Filename) - 2, 4); ID := StrToInt(StrID); Filename := LeftStr(Filename, Length(Filename) - 5); // Load the Lib Module := LoadLibraryExW(PWideChar(Filename), 0, LOAD_LIBRARY_AS_DATAFILE); // check for error if Module <> INVALID_HANDLE_VALUE then begin Icon := TIcon.Create; Icon.LoadFromResourceID(Module, ID); if Module <> 0 then FreeLibrary(Module); end; end; |
AW: Das Handle ist ungültig
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:
Beispielaufruf (mit sinnloser Zwischenvariable, damit der Code mehrzeilig wird, weil das Forum Einzeiler nicht in einen vollständigen Codeblock packt):
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;
Delphi-Quellcode:
Grüße
var s: WideString;
s:= _SHLoadIndirectString('@%SystemRoot%\System32\AudioSrv.Dll,-202'); ShowMessage(s); Dalai |
AW: Das Handle ist ungültig
Zitat:
Delphi-Quellcode:
HR := SessionControl2.GetDisplayName(pDisplayName);
Mein Probem ist nur es gibt keine uses für SHLoadIndirectString ;) Aber dein code ist erheblich kürzer. :thumb: Aber nur für den DisplayString. gruss |
AW: Das Handle ist ungültig
Zitat:
Zitat:
Zitat:
Code:
wird also ebenfalls in einen aussagekräftigen String (Anzeigename) übersetzt.
@{Microsoft.MSPaint_2.1709.4027.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.MSPaint/resources/AppName}
Grüße Dalai |
AW: Das Handle ist ungültig
Zitat:
Ok ich halt mich raus. |
AW: Das Handle ist ungültig
Zitat:
Auf einem Koreanischen System ist es %windir% siehe Shot... Hmm jetzt habe ich ein Problem mit den Icons. Der DisplayName sollte mit deiner Funktion richtig angezeigt werden.
Delphi-Quellcode:
function SHLoadIndirectString(pszSource, psuOutBuf: PWideChar; const ccOutBuf: UINT; var ppvReserved: Pointer): HRESULT; stdcall; external SHLWAPIDLL;
Ja, ja genau diese uses hatte ich eingebunden aber D2010 hat nix gefunden.. Danke. Für dein Schnipsel werde es verwenden in umbenannter Form. Zitat:
gruss |
AW: Das Handle ist ungültig
Zitat:
Zitat:
PS: Wusste gar nicht, dass es Windows-Systeme mit einem anderen Pfadtrenner als dem Backslash gibt. Interessant. Grüße Dalai |
AW: Das Handle ist ungültig
Hmm..
Zitat:
Dies hat damit zu tun, das eine URL oder ein Dateiname intern eigentlich gleich behandelt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 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