Einzelnen Beitrag anzeigen

Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#6

Re: dll im Programm unterbringen

  Alt 10. Nov 2003, 20:36
Aber, aber... wer wird denn für so ne kleine Aufgabe direkt ein Progrämmsche kaufen?

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

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

{$R bass.RES}
Gruß

Wormid
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat