Entwickler-Ecke

Sonstiges (Delphi) - Bilder in DLL oder so speichern


Danny87 - Do 21.09.06 14:02
Titel: Bilder in DLL oder so speichern
Hey Leute,

da ich nicht will, dass mein Spiel von jedem X-Beliebigen gemoddet werden kann, möchte ich die Bilder
gerne in einer DLL oder so speichern, damit man sie nicht mehr mit einem Grafikprogram öffnen kann.
Ausserdem möchte ich in so einer Datei ganze Image-Sets ablegen.
Gibt es da möglichkeiten?
Ich habe leider absolut keine Ahnung, wie ich das machen soll... :-/
Waäre cool, wenn ihr mir ein paar Tips geben könntet wonach ich suchen kann und/oder womit ich mich
beschäftigen muss um das zu realisieren (wenn das überhaupt geht).


Gruss
Daniel


Nemesis II - Do 21.09.06 14:59

bei kleinen Sachen mache ich das über die Resource-Funktion, da bleiben die Dateien in der Anwendung erhalten, ohne dll

öffne Texteditor > Eingabe:
ResName1 ResTYPE1 ResFileName1
ResName2 ResTYPE2 ResFileName2
...
ResNameX ResTYPEX ResFileNameX

ResName1 = Name der Datei zum identifizieren bei Delphi
ResTYPE1 = Der Typ der Recource Datei: WAVE, AVI, RCDATA (geeignet für Bilder oder andere Dateien), CURSOR
ResFileName1 = komplette Pfad der zu einbindenden Datei

speichere den Text als (*.RC) Datei

öffne Resource Compiler BRC32.exe (C:\Programme\Borland\BDS\3.0\Bin) bzw. schiebe die (*.RC) Datei darüber

es wurde eine (*.RES) Datei erstellt

kopiere (*.RES) Datei zum Project Ordner in Eigene Dateien

(*.RES) Datei in Delphi verlinken:

Delphi-Quelltext
1:
2:
3:
implementation
{$R *.dfm}
{$R Namer der Datei.RES}


RESOURCE-DATEI aufrufen für Video:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
begin
with Animate1 do begin
ResName := 'ResName1';
ResHandle := hInstance;
Active := TRUE;
end;
end;


RESOURCE-DATEI aufrufen für WAVE:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
uses mmsystem;
...
procedure TForm1.Button1Click(Sender: TObject);
var
hFind, hRes: THandle;
Song: PChar;
begin
hFind:=FindResource(HInstance, 'ResName2''WAVE');
if hFind<>0 then begin
hRes:=LoadResource(HInstance, hFind);
if hRes<>0 then begin
Song:=LockResource(hRes);
if Assigned(Song) then
SndPlaySound(Song, snd_ASync or snd_Memory);
UnlockResource(hRes);
end;
FreeResource(hFind);
end;
end;



RESOURCE-DATEI aufrufen für MP3:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button1Click(Sender: TObject);
var
rStream: TResourceStream;
fStream: TFileStream;
fname: string;
begin
{this part extracts the mp3 from exe}
fname:=ExtractFileDir(Paramstr(0))+'Intro.mp3';
rStream := TResourceStream.Create
(hInstance, 'Intro', RT_RCDATA);
try
fStream := TFileStream.Create(fname, fmCreate);
try
fStream.CopyFrom(rStream, 0);
finally
fStream.Free;
end;
finally
rStream.Free;
end;
{this part plays the mp3}
MediaPlayer1.Close;
MediaPlayer1.FileName:=fname;
MediaPlayer1.Open;
end;



RESOURCE-DATEI aufrufen für CURSOR:

Delphi-Quelltext
1:
2:
3:
4:
5:
const crMyCursor = 1;
begin
Screen.Cursors[crMyCursor] := LoadCursor(hInstance,PChar ('ResName vom Cursor'));
Form1.Cursor := crMyCursor;
end;


Danny87 - Do 21.09.06 15:46

nee, soll ja dynamisch austauschbar sein.
hab mir das auch schon mit res überlegt, aber die werden ja beim compilieren in den code includet und sind somit nicht dynamisch austauschbar.

//EDIT: oder irre ich mich da?


wulfskin - Do 21.09.06 21:28

user profile iconDanny87 hat folgendes geschrieben:
nee, soll ja dynamisch austauschbar sein.
Ja, das wird so einfach dann nicht gehen.
Ich würde sie mit einem einfachen Algorithmus verschlüsseln und das Problem wäre gelöst...


Danny87 - Do 21.09.06 23:02

dann hätte ich aber jedes bild einzeln, aber ich brauch ja ganze imagesets.


jakobwenzel - Fr 22.09.06 08:08

Würds denn nich gehen, die ganzen Bilder, ... als Resource in ne DLL einzubinden und dann von da zu laden?


Danny87 - Fr 22.09.06 13:27

hmm....das muss ich mal ausprobieren.
meld mich dann nochmal :-)


Danny87 - Fr 22.09.06 13:53

Entweder mach ich was falsch oder .... nee, ich mach was falsch...

So stehts in der DLL:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{$R Untitled1.res}

procedure test(var image : TImage; HInstance : cardinal); stdcall;
begin
image.Picture.Bitmap.LoadFromResourceName(HInstance,'Bitmap1');
end;


aber wenn ich aus dem Programm die Prozedur "test" aufrufe bringt er mir ne Fehlermeldung, dass die
Ressource Bitmap1 nicht gefunden werden konnte.

Ich hab mal 2 Screenshots angehängt. Einer von der res-Datei (im Imageeditor geöffnet) und der andere von der Fehlermeldung.


Danny87 - Mo 25.09.06 15:26

Kann mir wirklich keiner sagen, was ich falsch mache und/oder wies richtig geht? :cry: :wink: