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