Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aufruf von Resource will nicht funktionieren (https://www.delphipraxis.net/55872-aufruf-von-resource-will-nicht-funktionieren.html)

Avax2k 28. Okt 2005 04:50


Aufruf von Resource will nicht funktionieren
 
hallo habe folgenden Code um eine Datei aus einer Res-datei auszuführen
Delphi-Quellcode:
implementation

{$R *.dfm}
{$R F:\Test.res}

function ExtractResTo(Instance: LongWord; BinResName, NewPath, ResType: PChar): Boolean;
(*******************************************************************************
Function:  ExtractResTo
Returns:   Boolean (true=success)
Version:   Function version 3.0[mod]
             Parameters modified, SEH stripped.
*******************************************************************************)
var
  ResSize,
    HG,
    HI,
    SizeWritten,
    hFileWrite: LongWord;
begin
  result := false;
  HI := FindResource(Instance, BinResname, ResType);
  if HI <> 0 then
  begin
    HG := LoadResource(Instance, HI);
    if HG <> 0 then
    begin
      ResSize := SizeOfResource(Instance, HI);
      hFileWrite := CreateFile(NewPath, 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
      begin
        result := (WriteFile(hFileWrite, LockResource(HG)^, ResSize,
          SizeWritten, nil) and (SizeWritten = ResSize));
        CloseHandle(hFileWrite);
      end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ExtractResTo(HInstance,'Test.res','F:\',RT_RCDATA);
ShellExecute(Application.Handle, 'open', 'F:\Test.exe',nil,nil,SW_SHOW);
end;
die Mainform wird aufgerufen, ohne fehler, jedoch die Test.exe nicht aus der test.res entpackt und auch nicht ausgeführt.
Der Inhalt der RC-Datei die mit BCC32 ausgeführt wurde war wie folgt:
Zitat:

Prog1 RCDATA Test.exe
habe ich jetzt den Befehl falsch aufgerufen, oder ist da woanders einFehler, der die Datei nicht wieder aus der Res extrahieren will??

wäre dankbar, wenn jemand den Aufruf, sofern dieser falsch sein sollte korrigiert oder einen anderen fehler der ursächlich ist.

marabu 28. Okt 2005 05:02

Re: Aufruf von Resource will nicht funktionieren
 
Moin Avax2k,

probiere doch mal so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ExtractResTo(HInstance, 'Prog1', 'F:\Test.exe', RT_RCDATA);
  ShellExecute(Application.Handle, 'open', 'F:\Test.exe', nil, nil, SW_SHOW);
end;
Grüße vom marabu

Avax2k 28. Okt 2005 05:15

Re: Aufruf von Resource will nicht funktionieren
 
hallo marabu

und schon wieder hast du mir weitergeholfen, denn es funktioniert.

Ich habe jedoch ein kleines Problem und zwar die Test.exe ist, wenn sie auf der Platte ist kopierbar.
Gibt es eine Möglichkeit das Kopieren der Datei zu verhindern?

marabu 28. Okt 2005 05:33

Re: Aufruf von Resource will nicht funktionieren
 
Dazu fallen mir zwei Sachen ein. Wenn du deine Resource auf meinem Rechner auspacken willst, dann wird dein Programm scheitern, da es bei mir kein F Laufwerk gibt. Und wenn dein ausgepacktes Programm jemals laufen soll, dann braucht der Starter das EXECUTABLE Recht, welches unter Windows mit dem READ Recht verknüpft ist. Abgesehen davon, dass auf vielen Rechnern XP Home läuft und dort diese Rechte nicht zur Verfügung stehen, kannst du auch nicht einfach ein Benutzer-Konto auf einer fremden Maschine einrichten, dem du exklusiven Zugriff auf diese ausführbare Datei gibst. Was hast du denn vor?

marabu

Avax2k 28. Okt 2005 11:26

Re: Aufruf von Resource will nicht funktionieren
 
mir ist bewusst, dass nur wenige eine F:\ Partition besitzen, jedoch habe ich dies mit F:\ lediglich getestet ob mein Programm auch wirklich das tut, was ich will, im späteren Programm würede ich es dann abändern.
Was ich dadurch erreichen will ist, ich möchte Dateien einbinden, die nur beim Ausführen eines bestimmten Befehls im Hauptprogramm aus der hauptanwendung extrahiert und ausgeführt werden. Will damit verhindern, dass die Leute sich bestimmte Dateien einfach so kopieren können, wenn es Sound dateien sind zum Beispiel und dann ohne mein Programm einfach in jedem Player abspielen könnten.
Habe mir überlegt die Dateien nur in den Speicher zu lesen und nicht auf die Platte zu schreiben, aber das würde bei Systemen mit wenig Arbeitsspeicher zu großen Problemen führen und das System nur unnötig ausbremsen. Wobei wenn ich jeweils nur immer eine datei laden würde, könnte es gehen auch wenn diese 100mb ist da ja heutzutage die Windows XP Rechner mindestens 256MB Ram haben..oder doch nicht ?!

jedenfalls bin ich für andere Lösungswege aufgeschlossen :)

Luckie 28. Okt 2005 11:38

Re: Aufruf von Resource will nicht funktionieren
 
Vergiss es. Sollten sie nicht verschlüsselt in der Ressource stehen, kannst du sie mit jedem beliebigen ResHacker da rauskopieren.

Avax2k 28. Okt 2005 12:21

Re: Aufruf von Resource will nicht funktionieren
 
du hast recht, an diese Idee habe ich gar nicht gedacht..es würde somit ausreichen, dass ich zuerst meine Datei durch einen Ecoder schicke und die Dateiendung beibehalte.
Sprich:

wave1.wav --> Encoder ausgeführt --> wave1.wav die nicht mehr abgespielt werden kann beim Doppelklick da Fehlermeldung kommt, dass es keine gültige wav-Datei ist.
Dann könnte ich diese als Wave deklarierend in die Res packen und erst im Hauptprogramm den Encoder nach dem Aufruf der Datei starten mit dem Ergebnis, dass die Datei auf der Platte immer verschlüsselt wäre, auch in der Res und nur vom Programm entschlüsselt.
Somit würde jeder, der die Datei beim Entpacken aus der Res kopiert, nichts mit ihr anfangen können..es sei denn er hätte jetzt meinen Decoder..oder die verschlüsselung eben geknackt.

ich denke aber wenn ich RC4 verwende, sollte dies Problem für immer erledigt sein, oder was meint ihr ?

jfheins 28. Okt 2005 12:28

Re: Aufruf von Resource will nicht funktionieren
 
Vergiss es. :mrgreen:

Wenn alle Stricke reißen, kann man immernoch vom Lautsprecherausgang aufnehmen :P

Mal abgesehen, dass du sowisoeine entschlüsselte Datei auf der Festplatte ablegen musst, wenn du keinen eigenen Player schreiben willst.

Warum willst du deine Audiodateien eigendlich auf gedeh und verderb schützen ?

Und zur Not kann man die Entschlüsselungsroutine deines Programms kopieren, und dann die Ressourcen entschlüsseln, du siehst, es gibt quasi keinen wirksamen Schutz.

Avax2k 28. Okt 2005 13:32

Re: Aufruf von Resource will nicht funktionieren
 
es geht auch darum Otto-Normal Verbraucher davon abzuhalten Kopien anzufertigen.
Klar können die Profis jedes Programm knacken, aber wenn jeder so denken würde, wie du dann würde keine Softwarefirma einen Schutz machen sondern ihre Programme gleich verschenken.
Und die Entschlüsselungsroutine aus meinem Programm zu extrahieren ist eine Aufgabe die kein Möchtegern Hacker im Stande ist zu bewältigen, sondern eben dann nurjenigen, die auch in der Lage sind High-End geschützte Produkte mit Dongle Simulation usw. zu knacken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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