Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dll im Programm unterbringen (https://www.delphipraxis.net/11602-dll-im-programm-unterbringen.html)

HentaiD 10. Nov 2003 13:50


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

scp 10. Nov 2003 15:06

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)? :-)

Luckie 10. Nov 2003 16:01

Re: dll im Programm unterbringen
 
Du kannst sie in die Ressource packen und beim Programmstart auf die Festplatte "entpacken".

Assarbad 10. Nov 2003 16:10

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

HentaiD 10. Nov 2003 18:53

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

Wormid 10. Nov 2003 19:36

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:
BASS_DLL RCDATA BASS.dll
Das ganze wird fix per Kommandozeile kompiliert mit "brcc32 bass.rc", dabei entsteht dann die Datei "bass.RES".

In dein Projekt baust Du nun folgende Routinen ein (extra Unit, oder egal wo):

Delphi-Quellcode:
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;
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:

Delphi-Quellcode:
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;
Und dann muss die Dll (das Tempfile) natürlich noch gelöscht werden, bevor das Programm beendet wird, NACHDEM die Dll gefreet wurde.

Delphi-Quellcode:
//... in FormClose oder so...
Unload_BASSDLL;
Windows.DeleteFile(BASS_File);
...
Die ersten Routinen sind Copy&Paste, den Rest habe ich hier blind getippt, sind also Fehler möglich :mrgreen:

Und nicht vergessen, irgendwo die Resource via $R einzubinden!

Delphi-Quellcode:
{$R bass.RES}

Gruß

Wormid

Assarbad 10. Nov 2003 19:40

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 ... ;)

Wormid 10. Nov 2003 19:47

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...

Assarbad 10. Nov 2003 20:10

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:
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 ...
Boah, ob das nu in der Codelib ist ist doch auch egal, oder ;) ... schmeiss doch einfach deins nochmal rein ;)


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