Thema: Delphi Das Handle ist ungültig

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#73

AW: Das Handle ist ungültig

  Alt 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 MSDN-Library durchsuchenSHLoadIndirectString ü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, MSDN-Library durchsuchenExpandEnvironmentStrings 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)
  Mit Zitat antworten Zitat