Dll dynamisch einbinden

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Mike19
Beiträge: 6
Registriert: Sa 19. Dez 2009, 09:36
OS, Lazarus, FPC: Win 7, Lazarus 0.9.28.2, FPC 2.2.4
CPU-Target: 64Bit
Wohnort: Kabelsketal
Kontaktdaten:

Dll dynamisch einbinden

Beitrag von Mike19 »

Hier nun die nächste Frage,

Code: Alles auswählen

var
  Fstart: TFstart;
  hnd: THandle;
  myprog: procedure;
 
implementation
 
{ TFstart }
 
procedure TFstart.MenuItem2Click(Sender: TObject);
begin
  Close;
end;
 
procedure TFstart.MenuItem4Click(Sender: TObject);
begin
 hnd:=LoadLibrary(Pchar('peerf.dll'));
 if hnd <> 0 then
 begin
  @myprog:= GetProcaddress(hnd,'penew');
  if @myprog <> nil then
  begin
   Fstart.Visible:=False;
   myprog;
   Fstart.Visible:=True;
  end;
  FreeAndNil(hnd);
 end;
end;


warum bringt der in Compiler in dieser Zeile

Code: Alles auswählen

@myprog:= GetProcaddress(hnd,'penew');


die Meldung, er kann keinen Wert zuweisen ? Er findet das Handle, sonst würde ja dieser Teil überspringen.

Danke im voraus

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Dll dynamisch einbinden

Beitrag von Hitman »

Bist du im mode objfpc? dann lass einfach das @ weg ;-)
Kann allerdings sein, dass du den return value von GetProcAddress noch in deinen gewünschen Typ casten musst (den du in dem Fall dann natürlich vorher noch deklarieren solltest ...).

Mike19
Beiträge: 6
Registriert: Sa 19. Dez 2009, 09:36
OS, Lazarus, FPC: Win 7, Lazarus 0.9.28.2, FPC 2.2.4
CPU-Target: 64Bit
Wohnort: Kabelsketal
Kontaktdaten:

Re: Dll dynamisch einbinden

Beitrag von Mike19 »

Code: Alles auswählen

Bist du im mode objfpc? dann lass einfach das @ weg


und woher soll dann erkannt werden, das es um eine procedure von auserhalb handelt ?

Code: Alles auswählen

Kann allerdings sein, dass du den return value von GetProcAddress noch in deinen gewünschen Typ casten musst (den du in dem Fall dann natürlich vorher noch deklarieren solltest ...).


Das verstehe ich nicht, es gibt keine Werte, die übergeben werden sollen. Es handelt sich um einen rein ausgelagerten Programmteil, der nur bei Gebrauch nachgeladen wird.

Könntest Du mir mal ein kurzes Beispiel für das Einbinden einer dynamischen Dll und das anschliesende Ausführen einer Prozedure aus dieser coden. Ich stehe hier echt auf dem Schlauch. In Delphi klappt das immer mit meinem Code.

Danke

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Dll dynamisch einbinden

Beitrag von theo »

Das kann dir das FPC System selber sagen:

Wenn du den C header nicht hast, mach einfach eine Datei "hpastest.h" mit z.B.

Code: Alles auswählen

void hugo() { }


drin.

Dann mach auf der Kommandozeile

Code: Alles auswählen

h2pas -P hpastest.h


und schon hast du eine *.pp Datei mir den richtigen Dekl. für dynamisches Laden (-P)

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Dll dynamisch einbinden

Beitrag von RSE »

Du kannst dich im Lazarus-Wiki unter http://wiki.lazarus.freepascal.org/Lazarus/FPC_Libraries#Loadlibrary_-_loading_a_dynamic_library informieren. Die Funktionen der DynLibs-Unit kannst du unter http://lazarus-ccr.sourceforge.net/docs/rtl/dynlibs/index-5.html einsehen. Benutze die Lazarusgebundene Websuche hier im Forum, die ist Klasse!
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten