AGB  ·  Datenschutz  ·  Impressum  







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

Ressourcen mit WinAPI laden

Ein Thema von 3_of_8 · begonnen am 8. Jul 2006 · letzter Beitrag vom 9. Jul 2006
Antwort Antwort
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

Ressourcen mit WinAPI laden

  Alt 8. Jul 2006, 20:13
Morgen. Ich bastel grade für mich ein Programm, das ein JAR als Textressource hat und das dann beim Ausführen abspeichert und ausführt.

Da habe ich jetzt folgendes Problem: Momentan nutze ich noch nen TResourceStream, der allerdings mit Classes ordentlich auf die Dateigröße schlägt.

Daher wäre WinAPI deutlich effizienter.

Allerdings blicke ich bei LoadResource nicht ganz durch. Momentan sieht das ganze so aus:

(Buffer ist ein PChar)

Buffer:=Pointer(LoadResource(HINSTANCE, FindResource(HINSTANCE,
'jardata', 'text')));

Das ganze gibt keine AccessViolation, daher scheint Buffer zumindest mal nicht ins Speichernirvana zu zeigen. Allerdings ist Buffer bei Ausgabe in ner MessageBox leer.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Ressourcen mit WinAPI laden

  Alt 8. Jul 2006, 20:41
Hallo Manuel,

LoadResource() liefert ein Handle und keinen Pointer. Die korrekte Reihenfolge der benötigten API Funktionen kannst du u.a. in der Demo sehen, welche ich an Beitrag #4 angehängt habe.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Ressourcen mit WinAPI laden

  Alt 8. Jul 2006, 20:45
Hmm, ich habe es mal selber rumprobiert und hab meinen Code nach so abgeändert:

Delphi-Quellcode:
program JavaLaunch;

{$R 'jardata.res'}

uses
   Windows,
  ShellAPI,
  Classes;

var f: HFILE;
     Path, FileName: array[0..Max_Path] of char;
     hRes : HRSRC;
     hGlob : HGLOBAL;
      Buffer: String;
    dummy: DWORD;
    fstruct: _OFSTRUCT;
begin
  try
    hRes:=FindResource(HINSTANCE,'jardata', 'text');
    setlength(Buffer, SizeOfResource(HINSTANCE, hRes));
    hGlob:=LoadResource(HINSTANCE, hRes);
    Buffer:=String(PChar(LockResource(hGlob)));
  except
    on EResNotFound do exit;
  end;
  GetTempPath(Max_Path,Path);
  GetTempFileName(Path, '~tm', 0, FileName);
  Path:='C:\';
  FileName:='C:\blubb.jar';
  fstruct.cBytes:=sizeof(fstruct);
  f:=OpenFile(@FileName[0], fstruct, OF_WRITE);
  WriteFile(f, buffer, length(buffer), dummy, nil);
  CloseHandle(f);
  ShellExecute(0, 'open', 'java', PChar('-jar '+FileName), Path, 0);
end.
Was ist daran falsch? Buffer ist nur 4 Bytes lang und die Datei wird gar nicht geschrieben.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Ressourcen mit WinAPI laden

  Alt 8. Jul 2006, 23:13
Hi,

Zitat von 3_of_8:
Delphi-Quellcode:
  try
    hRes:=FindResource(HINSTANCE,'jardata', 'text');
Was ist daran falsch?
Also ich würde sagen schon diese Zeile. Das letzte Argument von FindResource sollte der Typ der Ressource sein, 'text' ist eigentlich kein wirklich vordefinierter Typ. Wenn ich also die Größe (in Byte) eines 4 Zeichen Strings betrachte, erklärt es dir vielleicht schon einiges (ohne jetzt den Rest anzuschauen)

Gruß Der Unwissende
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Ressourcen mit WinAPI laden

  Alt 8. Jul 2006, 23:16
Überlege mal: seit wann ist ein JAR-File eine Text-Resource? Schau dir dein JAR-File mal mit einem HEX-Editor an - alles bis zum ersten low value (#0) ist dein String.

marabu
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Ressourcen mit WinAPI laden

  Alt 8. Jul 2006, 23:21
Zitat:
Überlege mal: seit wann ist ein JAR-File eine Text-Resource?
Ne JAR-Datei ist ein Zip-Archiv.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Ressourcen mit WinAPI laden

  Alt 9. Jul 2006, 00:17
ARGH

Ich hab nicht an das nullterminierte gedacht.

Übrigens: Mit RCDATA funktionierts gar nicht mehr.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: Ressourcen mit WinAPI laden

  Alt 9. Jul 2006, 01:55
Uralt und funzt immernoch:
Delphi-Quellcode:
function ExtractResTo(Instance: hInst; BinResName, NewPath, ResType: string):
  boolean;
(*******************************************************************************
Function:  ExtractResTo
Returns:    Boolean (true=success)
Version:    Function version 3.0

Parameters
Instance:  is the instance handle of the module containing the resource. if not
            current module, use LLoadLibrary() and FreeLibrary() to load and free
            the module containing the resource.
BinResName: is the name of the resource to extract. this would even work with
            icons, cursors, texts, yaddayadda ...
NewPath:    path of the file to create from the resource (where to put the
            file)
ResType:    resource type. pre-defined values can be found in Windows.pas
            e.g. RT_RCDATA
*******************************************************************************)

var
  ResSize,
    HG,
    HI,
    SizeWritten,
    hFileWrite: Cardinal;
begin
  result := false;
  HI := FindResource(Instance, @binresname[1], @ResType[1]);
  if HI <> 0 then begin
    HG := LoadResource(Instance, HI);
    if HG <> 0 then
    try
      ResSize := SizeOfResource(Instance, HI);
      hFileWrite := CreateFile(@newpath[1], GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
        FILE_ATTRIBUTE_ARCHIVE, 0);
      if hFileWrite <> INVALID_HANDLE_VALUE then
      try
        result := (WriteFile(hFileWrite, LockResource(HG)^, ResSize,
          SizeWritten, nil) and (SizeWritten = ResSize));
      finally
        CloseHandle(hFileWrite);
      end;
    except;
    end;
  end;
end;
siehe auch hier und Hier im Forum suchenExtractResTo sowie Hier im Forum suchenPutBinResTo ...

Übrigens sind selbst Delphi-Strings (AnsiString, LongString, WideString) keine nullterminierten Zeichenketten, somit ist es absolut irrelevant für die Funktion ob die zu extrahierenden Daten nun Text sind oder nicht. Man kann sich auch gut vorstellen eine Liste von nullterminierten Strings als Ressource einzubinden, oder?!
Auch für Strings habe ich schon vor Jahren was geschrieben, finde es aber im Moment nicht. Ist aber sowieso nur eine Modifikation des ursprünglichen Codes der obigen Funktion gewesen.

Übrigens lautet die Konstante ja auch: RT_RCDATA, nur mal so ...

Denn wie wir alle wissen ist RT_RCDATA wie folgt deklariert:
Code:
#define RT_RCDATA          MAKEINTRESOURCE(10)
oder delphianisch:const RT_RCDATA = PChar(10);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Ressourcen mit WinAPI laden

  Alt 9. Jul 2006, 02:55
Und wenn ich mir das richtig gemerkt hab, dann sind Strings (TEXT) in den Resourcen anders definiert, als der Rest ... nämlich als ResourcenTabellen.

jeweils 16 Strings
der erste Teil des Identifier's ist sozusagen für die Tabelle und die niedrigsten 4 Bit für den String in det Tabelle.


Also, selbst wenn man es schaft per TEXT an etwas anderes ranzukommen, wäre es eh inkompatibel
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

Re: Ressourcen mit WinAPI laden

  Alt 9. Jul 2006, 12:54
Zitat von himitsu:
[...] Also, selbst wenn man es schaft per TEXT an etwas anderes ranzukommen, wäre es eh inkompatibel
Das ist wohl wahr. Ich meinte aber eher eingebettete Textdateien (z.B. für die Aboutbox - Luckie benutzte da was von mir - für Lizenztexte usw.), die ja auch wie Binärdateien behandelt werden, wenn man es nur von daher sieht wie sie eingebunden werden.
  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 18:36 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