Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL wird nicht geladen - Warum nicht??? (https://www.delphipraxis.net/51821-dll-wird-nicht-geladen-warum-nicht.html)

delphifan2004 19. Aug 2005 14:21


DLL wird nicht geladen - Warum nicht???
 
Hallo!

Vor einiger Zeit habe ich hier eine Frage zu Interfaces gepostet. Als Antwort erhielt ich u.a. folgenden Link:

http://www.delphipraxis.net/internal...=405336#405336

Im folgenden Code wird die DLL, die ein Plugin enthält, das mit Interfaces arbeitet, nicht geladen. Kennt jemand den Grund dafür?

Delphi-Quellcode:
procedure TForm1.mCfgToolsClick(Sender: TObject);
type
  TProcInitPlg = function: IPlugin; stdcall;
var
  fName: string;
  iPlg: IPlugin;
  aProc: TProcInitPlg;
  hDLL: HWND;
  fProc: TFarProc;
  mApp: TApp;
begin
 ShowMessage(GetCurrentDir); //hab die .dll extra dahin kopiert!

 with TOpenDialog.Create(nil) do begin
    if Execute then
      fName := FileName
    else begin ShowMessage('Datei existiert nicht!'); Exit; end;
  end;
  (*
  fName := GetCurrentDir;
  if fName[Length(fName)]<>'\' then fName := fName + '\';
  fName := fName + 'plugin.dll';
  *)
  hDll := LoadLibrary(@fName[1]);
  fProc := GetProcAddress(hDLL,'InitPlugin');
  if fProc <> nil then begin
    @aProc := fProc;
  end else begin ShowMessage('DLL konnte nicht geladen werden!'); Exit; end;
  iPlg := aProc;
  showMessage(iPlg.GetName);
  iPlg := nil;
  FreeLibrary(hDLL);
 end;
Oder ist es die Prozedur, die er nicht findet? Wenn ich die Unit ShareMem als ertes in meiner Formular Unit aufführe, erhalte ich ein Meldungsfenster mit dem Titel "Fehler beim Starten des Programms" und der Meldung "Die Datei Delphimm.dll ist verknüpft mit dem fehlenden Export-BORLNDMM.DLL-DunpBlocks". Was hat das zu bedeuten? Der Code für die Dll ist exakt der gleiche, wie in dem Thread, der oben als Link angegeben ist.

Schon mal Danke im Voraus für Eure Hilfe sagt

Delphifan2004

Sprint 19. Aug 2005 14:52

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

Zitat von delphifan2004
Wenn ich die Unit ShareMem als ertes in meiner Formular Unit aufführe, [..]

Hab mich mit deinem Problem nicht beschäftigt, aber dort ist definitiv die falsche Position.
Delphi-Quellcode:
program Project1;

uses
  ShareMem,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Delphi-Quellcode:
library Project2;

uses
  ShareMem,
  SysUtils,
  Classes;

{$R *.res}

begin
end.

tommie-lie 19. Aug 2005 14:54

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

Zitat von delphifan2004
Kennt jemand den Grund dafür?

Vielleicht weil das Gras grün ist?

Zitat:

Zitat von delphifan2004
Oder ist es die Prozedur, die er nicht findet?

Weiß nicht, exporitert die DLL die Funktion denn?

Schreib den Code mal so um:
Delphi-Quellcode:
  SetLastError(0);
  hDll := LoadLibrary(@fName[1]);
  if hDll = 0 then
    ShowMessage(IntToStr(GetLastError));
und teile mit, ob, und wenn ja was für ein Fehlercode kommt.

delphifan2004 19. Aug 2005 16:22

Re: DLL wird nicht geladen - Warum nicht???
 
Hallo tommie-lie!

Habe mit GetLastError den Fehlercode abgefragt, wie Du vorgeschlagen hast. Ich erhalte Fehlercode 31. Da ich keinen Fehlertext dazu habe (In meiner D3 Pro Hilfe steht nix dazu) kann ich damit momentan nix anfangen!

Wo gibt es Erläuterungen zu den Fehlercodes?

Gruß

Delphifan2004

Bernhard Geyer 19. Aug 2005 16:25

Re: DLL wird nicht geladen - Warum nicht???
 
Probiers mal damit:
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));

delphifan2004 19. Aug 2005 16:51

Re: DLL wird nicht geladen - Warum nicht???
 
Hallo Bernhard ...!

Danke erst mal für den Tipp mit SysErrorMessage(). Damit erhalte ich die Meldung:

"Ein an das System angeschlossenes Gerät funktioniert nicht"

Frage ist: Welches?

Ich tippe auf ein Problem mit der Stringübergabe, weil:

wenn ich die Unit ShareMem in der Projektdatei und/oder in der Form-Unit einbinde, erhalte ich

das Meldungsfenster mit dem Titel

"Fehler beim Starten des Programms"

und der Meldung

"Die Datei Delphimm.dll ist verknüpft mit dem fehlenden Export-BORLNDMM.DLL-DunpBlocks".

Was hat das zu bedeuten?

Außerdem erscheint ein Meldungsfenster mit dem Namen meiner Anwendung als Titel und der Meldung

"Vorgang kann nicht erzeugt werden"

Um auf obigen Text für SysErrorMessage(GetLastError) zurückzukommen, welches Gerät soll denn sonst für das Funktionieren meiner Anwendung so entscheidend sein.

Da ich mit ShareMem Probleme habe, tippe ich darauf, das das die Ursache ist. Bloß, warum lädt er dann meine Dll nicht? Eher müßte ich doch wegen fehlender ShareMem ne Exception kriegen, wenn ich Strings übergeben will, wozu ja ShareMem gebraucht wird.

Irgendwas stimmt hier nicht. Bloß Was!?!?

verzweifelte Grüße

Delphifan2004

tommie-lie 19. Aug 2005 16:58

Re: DLL wird nicht geladen - Warum nicht???
 
Pfff, solche Fehlercodes kennt man auswendig! :mrgreen: Die Fehlercodes sind in einem aktuellen PSDK enthalten, oder alternativ online im MSDN.
31 ist ERROR_GEN_FAILURE und heißt laut PSDK, daß eine Device nicht funktioniert. Ich hatte eigentlich eher auf 2 (file not found) oder 32 (sharing violation) gehofft. Mit 31 kann ich nicht viel anfangen, du könntest es mal mit einer anderen DLL probieren, die nichts mit Interfaces und sonstigem zu tun hat, einfach nur eine exportierte Funktion die zum Beispiel 'ne Messagebox anzeigt.


Nachtrag (ja, diesmal funktionierte der rote Kasten mal!):
"Gerät" heißt nicht ein Ding, das du anfassen kannst und irgendwo einstöpselst, es kann auch eine Datei sein.
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?

Luckie 19. Aug 2005 17:00

Re: DLL wird nicht geladen - Warum nicht???
 
Delphi-Quellcode:
ShowMessage(GetCurrentDir); //hab die .dll extra dahin kopiert!
Aha. Und wer sagt dir, dass das aktuelle Verzeichnis auch das ist, wo du deine DLL hinkopiert hast?

tommie-lie 19. Aug 2005 17:03

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

Zitat von Luckie
Aha. Und wer sagt dir, dass das aktuelle Verzeichnis auch das ist, wo du deine DLL hinkopiert hast?

Er lädt die Datei anhand eines OpenDialog, er wird sie wohl richtig ausgewählt haben, nehme ich an. Deswegen hätte mit Fehlercode 2 auch irritiert, aber damit könnte ich wenigstens was anfangen ;-)

Luckie 19. Aug 2005 17:15

Re: DLL wird nicht geladen - Warum nicht???
 
Hm, OK.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz