.Dll'sdynamisch laden.

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

.Dll'sdynamisch laden.

Beitrag von MAC »

Hallo, ich will so eine Art Add-on manager schreiben und wollte fragen wie kann in in einem Programm verschiedene Dll's dynamisch benutzen. Diese Dll's besitzen alle die selben Funktionen mit den selben Parametern, nur der Dateiname ist anders('prog1.dll','prog2.dll',...)

irgendwie so:

Code: Alles auswählen

var
i:integer;
a,b,c:integer;
begin
for i := 0 to 100 do 
begin
a := i;
b := 100-a;
c := machwas(a,b) external 'testdll' + InttoStr(i) +'.dll';  // so das machwas auf der dll testdll + i genommen wird.
end;
end;
ich kann die 100 Dlls eben nicht im interface teil declarieren und mitkompilieren, da sie dynamisch von benutzen hinzubefügt werden sollen...

Danke für Tipps.

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: .Dll'sdynamisch laden.

Beitrag von carli »

Die Funktionen heißen "LoadLibrary" und "GetProcAddress" aus der WinAPI.
Unter Linux heißt das ganze "dlopen" und "dlsym"

In Freepascal gibt's zusätzlich die plattformunabhängige Unit "dynlibs" (http://wiki.lazarus.freepascal.org/Laza ... _Libraries" onclick="window.open(this.href);return false;)

Hier die komplette Doku: http://www.freepascal.org/docs-html/rtl ... index.html" onclick="window.open(this.href);return false;

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: .Dll'sdynamisch laden.

Beitrag von MAC »

hat funktioniert (ich hab mich erstmal um andere sachen gekümmert bis ich das implementiert habe)

ich habe jetzt auf die andere seite ( = die dll) eine klasse übertrage und möcte diese von dort aus bearbeiten.
Ich habe mit string(World) // World ist eine Instanz der klasse TWorld.
und mit TWorld(astring) dann wirder zurückgewandelt.

Ich kann sagen das wenn ich dort abc einstecke - das in TWorld verwandle und wieder zurückwandle kommt wieder abc raus...
Wenn ich jetzt aber in der dll World bearbeite dann kommt ein sigsegv error (wahrscheinlich da ich auf ungültigen speicherbereich zugreife und das böse ist, genau das will ich aber)

Ach ja:
Die klasse ist abgeleitet von TComponent (konnte uahc TObject machen, wollte aber das in string umwandeln und so ausporibieren...)
Die Klassen die das hauptprogramm und die Dll verwenden sind nicht 100% identisch , sie sind identisch definiert (!!!) , allerding hab ich in einigen proceduren (die nicht aufgerufen werden und nicht aufgerufen werden sollen) keinen code der ausgeführt wird.
Zuletzt geändert von MAC am Sa 23. Apr 2011, 22:38, insgesamt 1-mal geändert.

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: .Dll'sdynamisch laden.

Beitrag von Maik81ftl »

weiß nicht mehr in welchen zusammen hang und von wehm ich die info bekommen hatte, aber Dynamische Library's lieber PChat statt String verwenden, Seit ich mich daran halte, habe ich auch keine Probleme mehr bei laden.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: .Dll'sdynamisch laden.

Beitrag von MAC »

ja, ich glaub den hast du von mir :)
ich war zumindest auch im gleichen thread beteidigt, dachte mir aber da ich ja außschließlich lazarus verwende sollte es auch so klappen...

aber ich denke gerade nach und kam zu einer viel leichteren idee - muss erstmal ausprobieren
...
...
so ich hab erstmal das sinnvollste überhaupt gemacht: nachgedacht was ich da überhaupt programmiert habe.

Mein ziel war es eine Klasse TWorld zu übergeben, ich habe das so gelöst
Klasse THelper erstellt.
Dort ein string hinzugefügt.
Dann die Klasse THelper versendet.
Daraus den string extrahiert.
dann gearbeitet...

jetzt übergeb ich direkt die klasse, und der fehler wird schonmal weniger :D

Edit:
es klappt sogar - jetzt muss ich noch noch ein paar fehler die von mir produziert werden korrigieren...

Code: Alles auswählen

Signatur := nil;

Antworten