Hallo tommie-lie!
Hab jetzt die folgende
Dll erstellt, deren Aufruf funktioniert, aber mit paar kleinen Schönheitsfehlern. Zuerst der Code der
DLL:
Delphi-Quellcode:
library MsgBoxDll;
uses
SysUtils, Dialogs,
Classes;
procedure MsgBox;
stdcall;
begin
ShowMessage('
Diese Box ist in einer DLL codiert!');
end;
exports
MsgBox;
begin
end.
//Habe mal ne andere Dll erzeugt, die ich jetzt lade.
//Habe den Code der Unit IntfApp jetzt wie folt geändert:
//Hier, wie gehabt, der OpenDialog
SetLastError(0);
hDll := LoadLibrary(@fName[1]);
if hDll = 0
then
//kommt jetzt nicht mehr, Dll wird also geladen
ShowMessage(SysErrorMessage(GetLastError));
fProc := GetProcAddress(hDLL,'
MsgBox');
//Prozedur MsgBox aus meiner DLL zuweisen
//da ich jetzt die obige Dll mit dieser Prozedur lade
if fProc <>
nil then begin
@aProc := fProc;
end else begin ShowMessage('
DLL konnte nicht geladen werden!'); Exit;
end;
iPlg := aProc;
//Hier erscheint dann die MessageBox (Procedure wird also aufgerufen)
showMessage(iPlg.GetName);
//Hier EAccessViolation ===WARUM???===
iPlg :=
nil;
FreeLibrary(hDLL);
end;
Mit dieser
Dll klappt das Laden und die Prozedur MsgBox läßt sich aufrufen. Bloß, mit der Zeile iPlg := aProc will ich doch erst mal einen Prozedurzeiger zuweisen. Erfolgt da ein Aufruf immer explizit, oder habe ich wieder mal ein Verständnisproblem?
Wenn ich die MessageBox aus der
Dll mit [Ok] quittiere, erhalte ich anschließend eine EAccessViolation. Warum das nun wieder?
Zitat von
tommie-lie:
Gerät" heißt nicht ein Ding, das du anfassen kannst und irgendwo einstöpselst, es kann auch eine Datei sein.
Ist mir klar. Es kann auch eine Software Schnittstelle sein, für ein Physikalisches Gerät.
Du sagst, Gerät kann auch eine Datei sein. Im konkreten Fall vermutlich unsere
Dll.
Zitat von
tommie-lie:
Und was machst du überhaupt mit der ShareMem? Willst du Pascal-Strings oder -Objekte an Funktionen der
DLL übergeben? Ich dachte um das zu vermeiden willst du Interfaces verwenden?
Im Editoradapter kommt ein AnsiString als Ergebnistyp vor und wie ich die Sache mit ShareMem verstanden habe, muß, sobald ich lange Strings (nicht PCHar oder ShortString) zum Datenaustausch (über Parameter oder Funktionsergebnisse) verwende, die
Unit ShareMem eingebunden werden, ob mir das gefällt oder nicht.
Zitat von
Luckie:
Aha. Und wer sagt dir, dass das aktuelle Verzeichnis auch das ist, wo du deine
DLL hinkopiert hast?
Niemand. Aber darüber habe ich mir noch keine Gedanken gemacht, weil ich ja mit meinem OpenDialog in ein Verzeichnis gehen kann, wo ich dann die richtige
Dll finde. Deshalb auch das Spielchen mit GetCurrentDir. Dorthin habe ich nun die
DLL kopiert, damit sie vom System gefunden wird, wenn ich OpenDialog weglasse.
Delphifan2004