resource Dateien --> gelöst

Für Fragen von Einsteigern und Programmieranfängern...
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

resource Dateien --> gelöst

Beitrag von Bauer321 »

Ich wollte einen kleinen Patcher für Minecraft machen, damit man schnell und einfach die version ändern kann jedoch klappt das leider nicht wie ich mir das wünsche.
Also ich habe eine resource datei(.res) in der ich die benötigten version habe.
Struktur sieht so aus:
Bild

Dann habe ich ein simples interface, das sieht in etwa so aus:
Bild
Da soll man dann einfach die Version auswähle könne nund Patch klicken

Dann bekomme ich immer diese Fehlermeldung:
Bild

Quellcode sieht so aus:

Code: Alles auswählen

unit umain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TFMain }
 
  TFMain = class(TForm)
    bpatch: TButton;
    ComboBox1: TComboBox;
    procedure bpatchClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Extractjar(rname:String);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  FMain: TFMain;
 
implementation
 
{$R *.lfm}
{$R res/minecraftjar.res}
 
{ TFMain }
 
procedure TFMain.bpatchClick(Sender: TObject);
begin
  if Combobox1.Text = 'Minecraft 1.5_01'
     then Extractjar('1501');
 
  if Combobox1.Text = 'Minecraft 1.4'
     then Extractjar('1400');
 
  if Combobox1.Text = 'Minecraft 1.3_01'
     then Extractjar('1201');
 
  if Combobox1.Text = 'Minecraft 1.2_02'
     then Extractjar('1202');
 
  if Combobox1.Text = 'Minecraft 1.1_02'
     then Extractjar('1102');
end;
 
procedure TFMain.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.Add('Minecraft 1.5_01');
  ComboBox1.Items.Add('Minecraft 1.4');
  ComboBox1.Items.Add('Minecraft 1.3_01');
  ComboBox1.Items.Add('Minecraft 1.2_02');
  ComboBox1.Items.Add('Minecraft 1.1_02');
end;
 
procedure TFMain.Extractjar(rname:String);
var
  S: TResourceStream;
  F: TFileStream;
begin
  S := TResourceStream.Create(HInstance, rname, 'RT_RCDATA');
  F := TFileStream.Create(ExtractFilePath(ParamStr(0)) + rname, fmCreate);
  F.CopyFrom(S, S.Size);
  F.Free;
  S.Free;
end;
 
end.
Was mache ich falsch?
Also der Fehler scheint ja offensichtlich zu sein das er die Ressource nicht findet jedoch ist sie ja da wenn ich mit ResourceHacker nachschaue
Zuletzt geändert von Bauer321 am Di 26. Apr 2011, 12:31, insgesamt 1-mal geändert.
www.mcpatcher.net | www.hoeper.me

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: resource Dateien

Beitrag von carli »

Bauer321 hat geschrieben: Bild

Code: Alles auswählen

procedure TFMain.bpatchClick(Sender: TObject);
begin
  if Combobox1.Text = 'Minecraft 1.5_01'
     then Extractjar('1501');
 
  if Combobox1.Text = 'Minecraft 1.4'
     then Extractjar('1400');
 
  if Combobox1.Text = 'Minecraft 1.3_01'
     then Extractjar('1201');
 
  if Combobox1.Text = 'Minecraft 1.2_02'
     then Extractjar('1202');
 
  if Combobox1.Text = 'Minecraft 1.1_02'
     then Extractjar('1102');
end;
 
Was mache ich falsch?
Also der Fehler scheint ja offensichtlich zu sein das er die Ressource nicht findet jedoch ist sie ja da wenn ich mit ResourceHacker nachschaue
Genau richtig.
Du gibst den Pfad zur Ressource ja auch nicht richtig an.

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: resource Dateien

Beitrag von Bauer321 »

wie muss ich ihn denn angeben?
weil die resource heißt doch 1501 bzw 1400 und so weiter
www.mcpatcher.net | www.hoeper.me

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: resource Dateien

Beitrag von carli »

Die Ressource heißt 1033 und befindet sich in einer Baumstruktur.

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: resource Dateien

Beitrag von Bauer321 »

und wie habe ich mit dieser baumstruktur umzugehen?
www.mcpatcher.net | www.hoeper.me

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: resource Dateien

Beitrag von carli »

Belies dich mal, wie ein Dateisystem funktioniert:
http://de.wikipedia.org/wiki/Verzeichnisstruktur" onclick="window.open(this.href);return false;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: resource Dateien

Beitrag von Bauer321 »

hilft mir bei der sache nicht weiter(zumindestens weiß ich nicht inwiefern es das tun soll)

Extractjar('RCDATA\1501\1033') --> geht nicht
Extractjar('1501\1033') --> geht nicht
Extractjar('1501/1033') --> geht nicht
Extractjar('RCDATA/1501/1033') --> geht nicht

mehr möglichkeiten kommen mir da so erstmal nicht in den sinn
www.mcpatcher.net | www.hoeper.me

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: resource Dateien

Beitrag von Bauer321 »

carli hat geschrieben:Die Ressource heißt 1033 und befindet sich in einer Baumstruktur.
Ich hab nochmal bei ResHacker geguckt, die 1033 ist so ne Art Language-Code, die Ressource selber heißt aber 1501
auch wenn ich mit ResHacker die Resource umbennene ändert sich die 1501 aber nicht die 1033
www.mcpatcher.net | www.hoeper.me

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: resource Dateien

Beitrag von carli »

Weil die Ressource 1501\1033 heißt

noch nie was von Dateien Ordnern gehört?

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: resource Dateien

Beitrag von Bauer321 »

natürlich schon was von ordnern gehört ich weiß wie ich dateipfade nutze usw und auf deine idee oder was auch immer mit 1501\1033 bin ich auch schon gekommen aber wenn ich das da einstze gehts trotzdem nicht

also so hab ich halt versucht und es geht aber trotzdem nicht:

Code: Alles auswählen

procedure TFMain.bpatchClick(Sender: TObject);
begin
  if Combobox1.Text = 'Minecraft 1.5_01' then Extractjar('1501\1033');
 
  if Combobox1.Text = 'Minecraft 1.4' then Extractjar('1400');
 
  if Combobox1.Text = 'Minecraft 1.3_01' then Extractjar('1201');
 
  if Combobox1.Text = 'Minecraft 1.2_02' then Extractjar('1202');
 
  if Combobox1.Text = 'Minecraft 1.1_02' then Extractjar('1102');
end;
 
procedure TFMain.Extractjar(rname:String);
var
  S: TResourceStream;
  F: TFileStream;
begin
  S := TResourceStream.Create(HInstance, rname, 'RT_RCDATA');
  F := TFileStream.Create(ExtractFilePath(ParamStr(0)) + rname, fmCreate);
  F.CopyFrom(S, S.Size);
  F.Free;
  S.Free;
end;
www.mcpatcher.net | www.hoeper.me

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: resource Dateien

Beitrag von carli »

Probiers mal damit:
http://www.freepascal.org/docs-html/rtl ... romid.html" onclick="window.open(this.href);return false;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: resource Dateien

Beitrag von Bauer321 »

wie bekomme ich denn die resource id?
da brauche ich doch sicherlcih noch ne funktion für oder?

ich habe übrigens eben versucht FindResource(HInstance, '1501\1033', 'RT_RCDATA'); zu benutzen und bekam eine 0 zurück laut beschreibung heißt das, dass die resource nicht gefunden werden konnte
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: resource Dateien

Beitrag von Socke »

Bauer321 hat geschrieben:wie bekomme ich denn die resource id?
Du kannst Ressourcen im allgemeinen entweder durch eine ID (natürliche Zahl) oder durch eine Zeichenkette identifizieren. Wenn du also eine ID vergeben hast, gibst du einfach nur diese an.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: resource Dateien

Beitrag von DiBo33 »

Übergebe dein Parameter nicht als String, sondern als integer und verwende TResourceStream.CreateFromId

desweiteren ist der Resourcetype nicht der String 'RT_RCDATA' sondern die Konstante RT_RCDATA.

Last but not least

Code: Alles auswählen

if Combobox1.Text = 'Minecraft 1.3_01' then Extractjar('1201');
schau die das mal ganz genau an.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: resource Dateien

Beitrag von carli »

Die ID scheint in deinem Fall 1201 zu sein.
Aber dass du da nicht selber drauf kommst?

Antworten