Einzelnen Beitrag anzeigen

thomasschaf
(Gast)

n/a Beiträge
 
#15

AW: eingebunde Resourcen abfragen (RCDATA)

  Alt 16. Mär 2012, 21:50
Hallo,

die Fehlermeldung ist
"Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden".

Was mich sehr wundert ist, dass das Design so komisch aussieht (siehe Screenshot 1).

Zum Test habe ich mal die Resource in ein Programm geschriben, das nicht von mir stammt (in diesem Beispiel in eine Kopie des Windows Calculator) und das Design und alle Funktionalitäten blieben erhalten. Leider verrät er mir selbst nicht, ob dieResource auch drin ist; Resource Hacker hat es aber wieder bestätigt. (siehe Screenshot 2)

Ich habe mir nun eine Function geschrieben, die mir ausgibt, welche Resourcetypen (RC_STRING, RC_ICON, ...) überhaupt gefunden werden:
Delphi-Quellcode:
function LetzterFehler: string; // Hilfsfunktion
begin
  Result := HintenEntfernen(SysErrorMessage(GetLastError), #13#10);
end;

function ResTypeExists(typeid: integer): boolean;
begin
  Result := False;
  try
    TResourceStream.Create(hinstance, 'irgendwasblabla', MakeIntResource(typeid));
    Result := True;
  except
    if isSubStr(LetzterFehler, 'name') then
      Result := True;
  end;
end;
Damit kann festgestellt werden, ob es an dem Typ liegt oder nur an dem Namen, warum die Resource nicht gefunden worden konnte.
Die Fehlermeldungen unterscheiden sich ja nur in folgendem:
  • Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden.
  • Der angegebene Ressourcenname wurde nicht in der Image-Datei gefunden

...und dann
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  sl: TStringList;
  d: DWORD;
begin
  d := GetTickCount;
  sl := TStringList.Create;
  for i := 0 to 1000 do
    if ResTypeExists(i) then
      sl.Add(IntToStr(i));
  ShowMessage('Zeit: ' + IntToStr(GetTickCount - d) + sLineBreak + 'gefunden:' +
    sLineBreak + sl.Text);
  // Ausgabe im Original: 3,5,14,24
  // Ausgabe nach Bearbeiten durch anderes Programm mittels UpdateResource: nichts mehr.
  // (Vergleich: siehe Screenshot 3)
  sl.Free;
end;
Es werden offensichtlich alle Resourcen vernichtet, wenn ich das Programm mit UpdateResource modifiziere.
Aber ResourceHacker versichert mir, dass die Resource RT_RCDATA hinzugefügt worden ist und alles sonst beibehalten worden ist.
Miniaturansicht angehängter Grafiken
screenshoty7eg.png   screenshotxqsr.png   screenshotbwpg.png  

Geändert von thomasschaf (16. Mär 2012 um 21:54 Uhr)
  Mit Zitat antworten Zitat