![]() |
Re: Problem mir StringResourcen...
Warum hältst du die maximale ID nicht auch als Resource vor?
marabu |
Re: Problem mir StringResourcen...
Dann könnt ich auch gleich hergehen und jedes mal die entspr. Schleife in meinem Programm anpassen....
Nein, ich will das nicht statisch lösen, sondern zur Laufzeit ermitteln :x ... Das es irgendwie gehen muß zeigen ja div. Resourcehacker, welche die Testresourcen auch exakt ermitteln können :gruebel: ... |
Re: Problem mir StringResourcen...
Die resource hacker analysieren die binären Daten der Resource. Übrigens, das mit deinen empty strings macht mich nachdenklich. Das WIN32 API kann nicht zwischen leeren oder fehlenden string resourcen unterscheiden - deshalb mein code weiter oben...
marabu PS: Auch wenn LoadString für leere und fehlende string resourcen die Länge 0 ermittelt - natürlich liefert GetLastError ERROR_RESOURCE_NAME_NOT_FOUND (1814) wenn nötig:
Delphi-Quellcode:
Aber du hast ja dein Problem gelöst...
// funktioniert nur bei fortlaufender ID
function GetMaxStringID(start: integer): integer; begin Result := start; repeat if (LoadStr(Result) = '') and (GetLastError = ERROR_RESOURCE_NAME_NOT_FOUND) then Break else Inc(Result); until false; if Result = start then Result := -1 else Result := Pred(Result); end; |
Re: Problem mir StringResourcen...
Zitat:
//EDIT: schon wieder kein roter Kasten :evil: |
Re: Problem mir StringResourcen...
Hallo Flocke,
Zitat:
Freundliche Grüße vom marabu |
Re: Problem mir StringResourcen...
Also Reshack "merkt" auch nicht, wenn eine leere Stringresource (163 und 165) da ist:
![]() Ich hab jetzt meine Funktion angepasst und nun läuft sie korrekt:
Delphi-Quellcode:
function GetMaxResID: integer;
function EnumResourceNamesProc(Module: HMODULE; ResType: PChar; ResID: Integer; lParam: TStringList): Integer; stdcall; function Fill(Wert: string): string; begin Result := Wert; while Length(Result) < 6 do Result := '0' + Result; end; var i: integer; Buffer: array[0..MAX_PATH] of Char; begin lParam.Add(Fill(IntToStr(ResId))); Result := 1; end; var Buffer: array[0..MAX_PATH] of Char; n, LastSection: integer; MyList: TStringList; begin LastSection := 0; MyList := TStringList.Create; MyList.Sorted := True; windows.EnumResourceNames(hinstance, RT_STRING, @EnumResourceNamesProc, Integer(MyList)); if (MyList.Count > 0) and (StrToIntDef(MyList[0], -1) = 1) then begin Result := 0; LastSection := 1; for n := 1 to MyList.Count - 1 do begin if StrToIntDef(MyList[n], -1) = StrToIntDef(MyList[n - 1], -1) + 1 then LastSection := StrToIntDef(MyList[n], -1) else break; end; for n := (LastSection - 1) * 16 to (LastSection) * 16 do if LoadString(hinstance, n, @Buffer, MAX_PATH) > 0 then Result := n; end else Result := 0; MyList.Free; end; |
Re: Problem mir StringResourcen...
Tcha, dann gibt es die entweder nicht, weil sie leer sind (und das Ergebnis bei LoadString bleibt sich ja sowieso gleich), oder man muß es direkt über die Strukturen der PE-Datei versuschen.
|
Re: Problem mir StringResourcen...
Zitat:
Der String, den man mit LoadString(N) lädt, steht in der Ressource vom Typ RT_STRING mit dem Namen MAKEINTRESOURCE((N div 16)+1) an Position (N mod 16). Wenn also der String 3 definiert ist, dann kann man rein technisch nicht mehr unterscheiden ob die Strings 0-2 und 4-15 auch definiert waren (eben leer) oder nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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