Einzelnen Beitrag anzeigen

delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: DLL wird nicht geladen - Warum nicht???

  Alt 19. Aug 2005, 17:39
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
  Mit Zitat antworten Zitat