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
Seite 9 von 10   « Erste     789 10      
EWeiss
(Gast)

n/a Beiträge
 
#81

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 19:37
Zitat:
Warum? Inwiefern? Hast du den von mir geschilderten Weg ausprobiert, und wenn ja, was war das Ergebnis? Momentan wüsste ich nicht, warum eine Extraktion eines Pfads aus einem indirekten Ressourcen-Strings und dem anschließenden Expandieren von Umgebungsvariablen scheitern sollte.
Ganz einfach..
DisplayName wurde mit deiner Funktion bearbeitet.
Das heißt egal welches Windows System welchen String übergibt. %windir%, %SystemRoot%, %futz%
Deine Funktion den richtigen Pfad zurück gibt vorausgesetzt er existiert in der Realität.

Nun! Die kann ich aber für das Icon nicht verwenden.
Also nutze ich jetzt meine Extrakt Routine mit %SystemRoot% und ein andere hat aber %Windir% was passiert?
Richtig das Icon wird falsch angezeigt oder hast du das nicht gesehen auf dem Screenshot?
Zitat:
Was muss Delphi denn da finden *kopfkratz*? Wenn die Konstante der DLL nicht definiert ist, kann man die noch nachpflegen
Logisch darum geht es gar nicht sondern das es diese Funktion in den Uses nicht gibt.
Langsam sollten die ihre Bibliotheken mal aktualisieren.
Sonst kann man direkt wieder nach VB6 zurück gehen da musste man auch alle API's zusammen suchen.

Zitat:
PS: Wusste gar nicht, dass es Windows-Systeme mit einem anderen Pfadtrenner als dem Backslash gibt. Interessant.
Man lernt halt immer wieder dazu

if SHLoadIndirectString(PWideChar(IconPfad), Lbuf, Length(Lbuf), Pointer(nil^)) = S_OK then
gibt zurück = '' = nothing.
Weil der IconPfad zur IconResource keinen string enthält ist ja auch logisch da liegt ein Icon.-

gruss

Geändert von EWeiss ( 6. Mai 2018 um 19:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#82

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 19:56
@HolgerX:
Schau mal auf die von Emil geposteten Bilder - es geht nicht um Slash und Backslash sondern um ein völlig anderes Zeichen auf dem koreanischen System.

Deine Funktion den richtigen Pfad zurück gibt vorausgesetzt er existiert in der Realität.
Richtig, wenn auch nicht den Pfad sondern den Inhalt des Ressourcen-Strings.

Zitat:
Nun! Die kann ich aber für das Icon nicht verwenden.
Soweit klar.

Zitat:
Also nutze ich jetzt meine Extrakt Routine mit %SystemRoot% und ein andere hat aber %Windir% was passiert?
Richtig das Icon wird falsch angezeigt oder hast du das nicht gesehen auf dem Screenshot?
Hab ich nicht drauf geachtet, weil ich annahm, dass du den von mit vorgeschlagenen Weg mal ausprobierst. Dann ist es nämlich völlig egal, ob, welche und wieviele Umgebungsvariablen in dem indirekten Ressourcen-String enthalten sind - ExpandEnvironmentStrings expandiert einfach alle. Anders ausgedrückt: StringReplace für Umgebungsvariablen ist eine dumme Idee.

Zitat:
Logisch darum geht es gar nicht sondern das es diese Funktion in den Uses nicht gibt. Langsam sollten die ihre Bibliotheken mal aktualisieren.
Nun, nicht alle Programmierumgebungen können ausnahmslos alle API-Funktionen deklarieren. Ich hab die Deklaration auch nur von den JEDIs geguttenbergt, wenn ich mich recht erinnere. Und letztlich kann man eine Deklaration einer API-Funktion auch selber schreiben, wenn es nirgends eine gibt, auch wenn das unter Umständen manchmal etwas Hirnschmalz erfordert. Keine Ahnung, nach welchen Kriterien Emba die Units mit Leben füllt, und entscheiden, ob und welche Funktionen aufgenommen werden oder nicht. Ja, es wäre schön, wenn (fast) alles vordefiniert wäre, aber weil ich weiß, dass das einfach nicht möglich ist, rege ich mich da nicht auf.

Grüße
Dalai

Geändert von Dalai ( 6. Mai 2018 um 19:58 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#83

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:00
Zitat:
in dem indirekten Ressourcen-String enthalten sind
Ich weiß nicht ob wir aneinander vorbeireden.

Ich verwende deine Funktion aber sie nutzt mir für den IconPfad nichts.

Weil ich hier nach einem Icon suche nicht nach einem String in der Ressourcen Datei.
Die API wird zwar den Pfad %Windir%\System32 intern richtig verarbeiten gibt aber nichts zurück weil die gesamte API den Ressourcenstring
als Rückgabe beinhaltet.

Diese gibt mir wie schon gesagt nix zurück.
Glaube aber es liegt nicht am Koreanischen System sondern an der Windows Version er verwendet W10
Scheint das die Umgebungsvariable dort geändert wurde.
Von SystemRoot nach Windir

Was ich also benötige ist eine API welche die Umgebungsvariable egal welche ich übergebe als
korrekten Pfad zurückgibt ohne das ich den String selbst extrahieren muss.
Das dürfte schwer sein mit der angehängten ID des Icon OK die könnte ich notfalls wegmachen.

gruss

Geändert von EWeiss ( 6. Mai 2018 um 20:15 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#84

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:26
Hmm..


Was ich also benötige ist eine API welche die Umgebungsvariable egal welche ich übergebe als
korrekten Pfad zurückgibt ohne das ich den String selbst extrahieren muss.
Das dürfte schwer sein mit der angehängten ID des Icon OK die könnte ich notfalls wegmachen.
Da es sich bei den %Blubber% um EnvironmentStrings handelt, hier mal was aus dem Netz:

Delphi-Quellcode:
function ExpandEnvVars(const Str: string): string;
var
  BufSize: Integer; // size of expanded string
begin
  Result := Str;
  // Get required buffer size
  BufSize := ExpandEnvironmentStrings(PChar(Str), nil, 0);
  if BufSize > 0 then
  begin
    // Read expanded string into result string
    SetLength(Result, BufSize);
    ExpandEnvironmentStrings(PChar(Str), PChar(Result), BufSize);
  end;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#85

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:28
Hmm..


Was ich also benötige ist eine API welche die Umgebungsvariable egal welche ich übergebe als
korrekten Pfad zurückgibt ohne das ich den String selbst extrahieren muss.
Das dürfte schwer sein mit der angehängten ID des Icon OK die könnte ich notfalls wegmachen.
Da es sich bei den %Blubber% um EnvironmentStrings handelt, hier mal was aus dem Netz:

Delphi-Quellcode:
function ExpandEnvVars(const Str: string): string;
var
  BufSize: Integer; // size of expanded string
begin
  Result := Str;
  // Get required buffer size
  BufSize := ExpandEnvironmentStrings(PChar(Str), nil, 0);
  if BufSize > 0 then
  begin
    // Read expanded string into result string
    SetLength(Result, BufSize);
    ExpandEnvironmentStrings(PChar(Str), PChar(Result), BufSize);
  end;
end;
Werde es mal testen

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#86

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:28
OK, ich beschreibe nochmals den Weg, den ich gehen würde, ausgehend von der folgenden Struktur des indirekten Ressourcen-Strings (völlig egal ob für Strings, Icons oder sonstwas) - @<Pfad_zur_Datei>,-<ID_der_Ressource>:
  • das @ am Anfang entfernen
  • Die ID am Ende des Strings extrahieren, also alles vom Ende des Strings bis zum Komma und in einem Integer, DWORD oder so speichern, und anschließend vom String entfernen.
  • Nach den beiden obigen Schritten bleibt von dem indirekten Ressourcen-String nur noch der Pfad übrig, nichts weiter, daher kann man den einfach an ExpandEnvironmentStrings übergeben. Mit anderen Worten, aus %SystemRoot%\system32\irgendwas.dll wird C:\Windows\system32\irgendwas.dll (und selbiges gilt für %WinDir%\system32\irgendwas.dll).

Grüße
Dalai

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

n/a Beiträge
 
#87

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20: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 21:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#88

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20:49
Man kann auch "Alles" an ExpandEnvironmentStrings übergeben und es werden alle bekannten %xxx% ersetzt.
Aber für den Zugriff muß man es dennoch zerlegen.

Das @ gibt an, dass es kein direkter Text oder Pfad zu einem Icon ist, sondern eine Referenz auf eine Ressource.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#89

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 20: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
 
#90

AW: Das Handle ist ungültig

  Alt 6. Mai 2018, 21: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 16:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 9 von 10   « Erste     789 10      


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 16:30 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