![]() |
dll im Programm unterbringen
Hi!
Ich schreibe grade ein programm , das im Hintergrund xms abspielt. Die unit , die ich dazu brauche , braucht selber noch eine dll. Ich möchte aber ungerne eine dll im Programmordner haben. Also dachte ich mir es müsste doch gehen die dll ins Programm zu lagern , so dass ich die dll nicht mehr im ordner brauche. Eben wie ein Image , welches dann im Programm irgendwo gelagert ist. :mrgreen: Hoffe ihr könnt mir helfen Greetz,D |
Re: dll im Programm unterbringen
Hast du schonmal den Autor der DLL gefragt, ob ihm das gefallen würde (nehme mal an das bist du nicht selber)? :-)
|
Re: dll im Programm unterbringen
Du kannst sie in die Ressource packen und beim Programmstart auf die Festplatte "entpacken".
|
Re: dll im Programm unterbringen
Ich wuerde mal PEBundle empfehlen. Ist ein excellentes Programm. Habe es selber auch gekauft.
Mit entpacken geht es auch im Eigenbau, Stichwort "BINRES" in meinem Hook-Tutorial. Oliver |
Re: dll im Programm unterbringen
ne hab die dll nicht selber geschrieben. Aber :
* Free! - you may freely use BASS in your freeware games/demos/etc... ;) Also wies scheint ist PEBundle genau das , was ich gesucht habe Danke! Greetz,D |
Re: dll im Programm unterbringen
Aber, aber... wer wird denn für so ne kleine Aufgabe direkt ein Progrämmsche kaufen? :warn:
Also, als erstes erstellst du mit einem Texteditor eine Textdatei, die du z.B. unter dem Namen "bass.rc" abspeicherst und schreibst folgendes hinein:
Code:
Das ganze wird fix per Kommandozeile kompiliert mit "brcc32 bass.rc", dabei entsteht dann die Datei "bass.RES".
BASS_DLL RCDATA BASS.dll
In dein Projekt baust Du nun folgende Routinen ein (extra Unit, oder egal wo):
Delphi-Quellcode:
Und dann baust du vor der Stelle an der die DLL geladen wird (ich gehe davon aus, das du die dynamic_bass.pas nutzt) folgendes ein:
function GetTempFileNameEx(Prefix: String = '~zz'): String;
var Buffer: PChar; begin Buffer := ''; Result := PChar(0); try GetMem(Buffer, MAX_PATH); if GetTempPath(MAX_PATH, Buffer) <> 0 then if GetTempFileName(Buffer, PChar(Prefix), 0, Buffer) <> 0 then Result := String(Buffer); finally Dispose(Buffer); end; end; function ExtractResource(Instance: THandle; Filename, ResName: PChar; ResType: PChar): Cardinal; var HGlobal, FHandle: THandle; HResInfo: HRSRC; Ptr : Pointer; begin Result := 0; HResInfo := FindResource(Instance, ResName, PChar(ResType)); if HResInfo = 0 then Exit; HGlobal := LoadResource(Instance, HResInfo); if HGlobal = 0 then Exit; Ptr := LockResource(HGlobal); if Ptr <> nil then begin FHandle := CreateFile(Filename, GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if FHandle <> INVALID_HANDLE_VALUE then begin Result := SizeOfResource(Instance, HResInfo); Windows.WriteFile(FHandle, Ptr^, Result, LongWord(Result), nil); CloseHandle(FHandle); end; UnlockResource(HGlobal); FreeResource(HGlobal); end; end;
Delphi-Quellcode:
Und dann muss die Dll (das Tempfile) natürlich noch gelöscht werden, bevor das Programm beendet wird, NACHDEM die Dll gefreet wurde.
var BASS_File: PChar; // Globale Var oder so... wird zum löschen der Datei nachher gebraucht!
... BASS_File := PChar(GetTempFileNameEx); if BASS_File <> PChar(0) then begin if ExtractResource(HInstance, BASS_File, 'BASS_DLL', RT_RCDATA) > 0 then begin Load_BASSDLL(ExtractFilePath(BASS_File), ExtractFileName(BassFile)); // Nun sollte man auch testen, ob es geklappt hat... end; end;
Delphi-Quellcode:
Die ersten Routinen sind Copy&Paste, den Rest habe ich hier blind getippt, sind also Fehler möglich :mrgreen:
//... in FormClose oder so...
Unload_BASSDLL; Windows.DeleteFile(BASS_File); ... Und nicht vergessen, irgendwo die Resource via $R einzubinden!
Delphi-Quellcode:
{$R bass.RES}
Gruß Wormid |
Re: dll im Programm unterbringen
ROFL ... siehe BINRES. Hatte ich schon vorgeschlagen. Allerdings wollte er das nicht extrahieren. Irgendwie kommt mir der Source auch bekannt vor ... ;)
|
Re: dll im Programm unterbringen
Ich hatte erst überlegt das reinzuschreiben, weil ich wusste, das das kommt...
Deine und meine Routine sind sich in der Tat ziemlich ähnlich (wobei ich Deine auf die schnelle jetzt leider nicht gefunden habe), aber meine habe ich in der Tat selber geschrieben, ob du es glaubst oder nicht. Gruß Wormid Edit: War denn "putbinresto" nicht mal in der CodeLibrary enthalten? Ich finde das da nicht mehr... Nur noch in diversen Beiträgen als Codeschnipsel... |
Re: dll im Programm unterbringen
*g* Wormid, das war doch nur als Scherz gemeint. Und selbst wenn ... bei einem popeligen 20Zeiler wuerde ich selbst wenn er sonstwie copyrighted waere nix sagen ;)
BTW: Nico hat sich mal meinen Code angeschaut und in der Tat hatte er recht damit, dass man zB FreeResource weglassen kann, Zitat:
Code:
Boah, ob das nu in der Codelib ist ist doch auch egal, oder ;) ... schmeiss doch einfach deins nochmal rein ;)
The FreeResource function is obsolete and is only supported for backward compatibility with 16-bit Microsoft® Windows®. It has been replaced by the following functions ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz