Autor Beitrag
Pseudo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Do 20.09.12 13:06 
Hallo DPler,
Ich möchte ein Plugin-System einbauen, scheitere aber am Anzeigen des Plugin Autors! Ich habe DLL's noch nie dynamisch geladen! Wie kann ich eine DLL dynamisch laden, dann eine Funktion in der DLL aufrufen und den Result wert zurückbekommen?

Danke


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 20.09.2012 um 14:17
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 20.09.12 13:23 
Pseudo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Do 20.09.12 13:48 
Tut mir leid, aber (zumindest in Lazarus) funktioniert die Angegebene Lösung nicht!
Er gibt eine Meldung aus, dass GetProcAddress einen Pointer zurückgibt, aber was soll ich mit einem Pointer? ich könnte die Funktion dann über CreateRemoThread in einem anderen Prozess starten, aber das wars sschon, oder?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 20.09.12 16:24 
Programm:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
  TheFunction=Function:PChar;
var
   h:THandle;
   myFunc:TheFunction;
begin
   h := LoadLibrary(Pchar(ExtractFilePath(Paramstr(0))+'MyLib.dll'));
   if h>0 then
      begin
          @myFunc:=GetProcAddress(h,'GetUsername');
          if Assigned(MyFunc) then Showmessage(myFunc);

      end;
   FreeLibrary(h);
end;

end.


DLL:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
library MyLib;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste
  Unit in der USES-Klausel Ihrer Bibliothek UND in der USES-Klausel Ihres Projekts
  (wählen Sie 'Projekt-Quelltext anzeigen') sein, wenn Ihre DLL Prozeduren oder Funktionen
  exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Dies
  gilt für alle Strings, die an oder von Ihrer DLL übergeben werden, auch für solche,
  die in Records und Klassen verschachtelt sind. ShareMem ist die Interface-Unit zur
  gemeinsamen BORLNDMM.DLL-Speicherverwaltung, die zusammen mit Ihrer DLL
  weitergegeben werden muss. Übergeben Sie String-Informationen mit PChar- oder ShortString-Parametern, um die Verwendung von BORLNDMM.DLL zu vermeiden.
 }


uses
  SysUtils,
  Classes;

{$R *.res}
      Function GetUsername:Pchar;
        begin
          Result := 'Testuser';
        end;
exports
  GetUsername;
begin



end.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.09.12 17:04 
user profile iconPseudo hat folgendes geschrieben Zum zitierten Posting springen:
Tut mir leid, aber (zumindest in Lazarus) funktioniert die Angegebene Lösung nicht!
Er gibt eine Meldung aus, dass GetProcAddress einen Pointer zurückgibt
In Lazarus musst du den Delphimode aktivieren oder das etwas anders schreiben. Such da am besten mal für Lazarus nach Beispielen für GetProcAddress...
Ich glaube du musstest da das @ vor der Variablen, in die du den Pointer legst, weglassen.