![]() |
Re: DLL wird nicht geladen - Warum nicht???
Hab das mal mit Delphi 3 unter Windows 95 getestet. Die Fehlermeldung kommt bei mir auch. Aber nur dann, wenn es sich nicht um eine DLL handelt.
Also hat delphifan2004 wohl keine DLL im TOpenDialog ausgewählt. |
Re: DLL wird nicht geladen - Warum nicht???
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:
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?
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; Wenn ich die MessageBox aus der Dll mit [Ok] quittiere, erhalte ich anschließend eine EAccessViolation. Warum das nun wieder? Zitat:
Du sagst, Gerät kann auch eine Datei sein. Im konkreten Fall vermutlich unsere Dll. Zitat:
Zitat:
Delphifan2004 |
Re: DLL wird nicht geladen - Warum nicht???
Zitat:
|
Re: DLL wird nicht geladen - Warum nicht???
Hallo Delphifan!
Haste auch den Prozedurtyp der neuen Situation angepasst? Wenn nicht, wundert mich die EAccessviolation nicht. Guck mal nach! Kannste glauben. |
Re: DLL wird nicht geladen - Warum nicht???
Zitat:
aProc ist die Funktion selbst, denn sie sit vom Typ TProcInitPlg. Wenn du in einem Delphi-Programm den Namen einer Funktion schreibst, die keinen Parameter benötigt, wird die Methode aufgerufen. Zum Beispiel GetLastError, schreibst du ja auch nicht, wie es eigentlich sinnvoll wäre, GetLastError(). Wenn du also iPlg := aProc hast, wird aProc aufgerufen und der Rückgabewert der Funktion der Variable iPlg zugewiesen. So, wie du deine Variablen deklariert hast, macht das für mich auch Sinn, daß iPlg := aProc die Funktion aProc auch aufruft, erscheint mir also richtig so (nicht nur syntaktisch, sondern auch semantisch). Zitat:
Zitat:
Hast du denn mal vor dem Laden fName überprüft, zum Beispiel indem du es in einer MessageBox anzeigst? Zitat:
|
Re: DLL wird nicht geladen - Warum nicht???
Hallo tommie-lie!
Danke erst mal für Deine Antwort. Zitat:
Damit weise ich an iPlg das Interface zu, das mit InitPlugin initialisiert wird. Damit ist erklärt, warum an dieser Stelle die Routine aufgerufen wird und die Zugriffsverletzung tritt auf, weil ich in meiner eigenen Test-Dll die exportierte Routine MsgBox als Prozedur definiert habe. Soweit Klar. Rest wird am Wochenende auseinander genommen. Zitat:
@tommie-lie: Ob das "noch inkompatibler" wird, weiß ich nicht. Wenn die Unit OpenSource ist, muss ich sie halt bei Verwendung mit weitergeben. Hier geht es aber ohnehin erst mal darum, das Beispiel zu verstehen und da ist halt ein AnsiString als Funktionsrückgabe dabei. In der praktischen Anwendung kann ich dann bei Stringübergaben immer noch PChars nehmen. Es grüßt Delphifan2004 |
Re: DLL wird nicht geladen - Warum nicht???
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: DLL wird nicht geladen - Warum nicht???
Zitat:
Was nun delphifan2004 macht, ist mir eigentlich völlig egal. Und auch nichts mit dem Thema zu tun. |
Re: DLL wird nicht geladen - Warum nicht???
Hallo!
Jetzt das Ganze noch mal im richtigen Thread: Ich beziehe mich immer noch aud diesen Link: ![]() und diesen Link hier: ![]() Der folgende Codeausschnitt soll mein Plugin ausführen:
Delphi-Quellcode:
Die MessageBox für den Fehlerfall erscheint nicht, und trotzdem erscheint der erwartete Text nach Drücken von Strg+V nicht in meinem Editor?
mApp := TApp.Create;
if Assigned(iPlg) then begin iPlg.Execute(mApp); end else ShowMessage('Plugin konnte nicht initialisiert werden!'); Was ist jetzt noch falsch? Die Dll wird jetzt geladen und ich bekomme auch den Text "Mein Testplugin" angezeigt. Aber der Text: "Dieser Text erscheint im Editor" erscheint nicht. Warum nicht? Zur Erinnerung noch mal die Execute Methode:
Delphi-Quellcode:
Sorry, Ich brauche doch noch mal Hilfe!
function TPlugin.Execute(App: IApp): Integer;
begin Result := 1; // True App.GetEditor.Content := 'Dieser Text erscheint im Editor.'; App.GetEditor.CopyToClipboard; end; Es grüßt Delphifan2004 |
Re: DLL wird nicht geladen - Warum nicht???
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr. |
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