(Gast)
n/a Beiträge
|
AW: Das Handle ist ungültig
6. Mai 2018, 03:13
Ich habe diesen String in Einzelteile zerlegt und möchte gerne wissen wie ihr das machen würdet.
Gar nicht in Einzelteile zerlegen, sondern diesen String direkt an SHLoadIndirectString übergeben, jedenfalls im Falle von String-Ressourcen. Für Icons hab ich bisher leider nichts vergleichbares gefunden.
Eine manuelle Verarbeitung - die ich nur für Nicht-String-Ressourcen machen würde - würde ich so angehen: das @ entfernen, ExpandEnvironmentStrings benutzen, um etwaige Umgebungsvariablen zu expandieren (dafür ist die Funktion da), den Icon-Index am Ende des Strings extrahieren und dann den resultierenden String und den Icon-Index an LoadIcon oder LoadImage o.ä. Funktionen übergeben, um die Icon-Ressource zu laden.
Grüße
Dalai
Also ich mache es so.. für DisplayName und für Icon
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:
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;
gruss
Geändert von EWeiss ( 6. Mai 2018 um 03:25 Uhr)
|
|
Zitat
|