AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Das Handle ist ungültig

Ein Thema von EWeiss · begonnen am 2. Mai 2018 · letzter Beitrag vom 6. Mai 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 19:47
Jetzt habe ich verstanden.. Warum schwer machen wenn es auch einfach geht.

Delphi-Quellcode:
procedure TAudioVolume.LoadIconPathfromResource(IconPath: PWideChar);
var
  Module: HModule;
  Filename: string;
  StrID: string;
  ID: DWORD;
  lpDest: PWideChar;
begin

  lpDest := nil;
  // Remove First @ Letter
  Filename := MidStr(IconPath, 2, Length(IconPath));
  // Extract ID
  StrID := MidStr(Filename, Length(Filename) - 2, 4);
  ID := StrToInt(StrID);
  // Remove ID from Path
  Filename := LeftStr(Filename, Length(Filename) - 5);

  ExpandEnvironmentStrings(PWideChar(Filename), lpDest, Length(Filename));

  if Assigned(lpDest) then
  begin
    // Load the Lib
    Module := LoadLibraryExW(lpDest, 0, LOAD_LIBRARY_AS_DATAFILE);
    // check for error
    if Module <> INVALID_HANDLE_VALUE then
    begin
      Icon := TIcon.Create;
      Icon.Handle := LoadIcon(Module, MakeIntResource(ID));
      if Module <> 0 then
        FreeLibrary(Module);
    end;
  end;
end;
Kann hier den Filename "StrID" noch splitten damit falls die ID mal <> 3 sein sollte es immer noch funktioniert.

gruss

Geändert von EWeiss ( 6. Mai 2018 um 20:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 19:50
Kann hier den Filename "StrID" noch splitten damit falls die ID mal <> 3 sein sollte es immer noch funktioniert.
Nicht splitten sondern das Komma suchen (z.B. mit Pos) und ab der Position die Zahl extrahieren.

Grüße
Dalai
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:03
Kann hier den Filename "StrID" noch splitten damit falls die ID mal <> 3 sein sollte es immer noch funktioniert.
Nicht splitten sondern das Komma suchen (z.B. mit Pos) und ab der Position die Zahl extrahieren.

Grüße
Dalai
Meine Split Funktion macht nichts anderes..
Sie sucht nach dem Komma zerlegt den String in ein Array und das höchste davon ist dann die ID..

PS:
ExpandEnvironmentStrings scheint nicht zuverlässig zu funktionieren.
Irgendwas falsch?
lpDest ist Nil und dann mal wieder nicht.

sorry wieder 2 Bilder..
Ich glaube mache langsam einen neuen Thread auf das hat ja langsam nichts mehr mit dem eigentlichen Thema "Handle" zu tun.
Wenn das Problem beseitigt ist.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.690 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:25
Delphi-Quellcode:
function GetEnvVarValue(const VarName: string): string;
var
  BufSize: Integer; // buffer size required for value
begin
  // Get required buffer size (inc. terminal #0)
  BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
  if BufSize > 0 then
  begin
    // Read env var value into result string
    SetLength(Result, BufSize - 1);
    GetEnvironmentVariable(PChar(VarName),
      PChar(Result), BufSize);
  end
  else
    // No such environment variable
    Result := '';
end;

procedure TForm1.Button1(Sender: TObject);
begin
  ShowMessage(GetEnvVarValue('SystemRoot'));
end;
hoffe es hilft!

edit
Delphi-Quellcode:
function ExpandEnvironment(const strValue: string): string;
var
  chrResult: array[0..1023] of Char;
  wrdReturn: DWORD;
begin
  wrdReturn := ExpandEnvironmentStrings(PChar(strValue), chrResult, 1024);
  if wrdReturn = 0 then
    Result := strValue
  else
  begin
    Result := Trim(chrResult);
  end;
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 6. Mai 2018 um 20:28 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:29
Diese Funktion beinhaltet die API ExpandEnvironmentStrings doch schon warum mehr schreiben als nötig?
Dann kann ich auch diese von HolgerX verwenden das funktioniert.

PS:
Danke habe die zweite variante mit dem Array versucht
Ok funktioniert es wäre ein Fehler wenn die Rückgabe 0 ist.

so ist es richtig.

Delphi-Quellcode:
procedure TAudioVolume.LoadIconPathfromResource(IconPath: PWideChar);
var
  Module: HModule;
  Filename: WideString;
  lpDest: array[0..MAX_PATH] of WideChar;
  StrID: string;
  ID: DWORD;
begin

  // Remove First @ Letter
  Filename := MidStr(IconPath, 2, Length(IconPath));
  // Extract ID
  StrID := MidStr(Filename, Length(Filename) - 2, 4);
  ID := StrToInt(StrID);
  // Remove ID from Path
  Filename := LeftStr(Filename, Length(Filename) - 5);

  FillChar(lpDest, SizeOf(lpDest), 0);
  if ExpandEnvironmentStrings(PWideChar(Filename), lpDest, Length(lpDest)) <> 0 then
  begin
    // Load the Lib
    Module := LoadLibraryExW(lpDest, 0, LOAD_LIBRARY_AS_DATAFILE);
    // check for error
    if Module <> INVALID_HANDLE_VALUE then
    begin
      Icon := TIcon.Create;
      Icon.Handle := LoadIcon(Module, MakeIntResource(ID));
      if Module <> 0 then
        FreeLibrary(Module);
    end;
  end;
end;
Manchmal wirklich

gruss

Geändert von EWeiss ( 6. Mai 2018 um 20:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.690 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:54
ExpandEnvironmentStrings(PWideChar(Filename), lpDest, Length(lpDest)) sicher das Length(lpDest) ausreicht? in meinem Beispiel wird von einem maximal wert ausgegangen und dann mit trim() gekürzt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:58
ExpandEnvironmentStrings(PWideChar(Filename), lpDest, Length(lpDest)) sicher das Length(lpDest) ausreicht? in meinem Beispiel wird von einem maximal wert ausgegangen und dann mit trim() gekürzt.
Du glaubst das ein Pfad länger als 260 Zeichen ist?
Es heißt ja nicht umsonst MAX_PATH oder?

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz