|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 05.04.2023, 09:10 Titel: dll erstellen mit Freebasic. |
|
|
Hallo, guten Tag.
Ich möchte bitte mit Freebasic eine Dll erstellen.
Nicht für Freebasic sondern für Liberty Basic.
- ASM Code soll in einer DLL eine Aufgabe erfüllem
- Freebasic soll eine normale Aufgabe in der DLL erfüllen und eine Lösung wo eine Pointer zur DLL kommt und das Freebasic soll die Pointer-Punkte erfüllen.
Wie ist das bitte machbar?
Ich habe mal eine Demo wie das in Purebasic aussieht.
Möchte diese aber bitte mit Freebasic erfüllen.
So sieht es bitte in Purebasic die DLL aus:
----------------------------------------------
ProcedureCDLL.l mult(a.l,b.l)
wert.l = a*b
ProcedureReturn wert.l
EndProcedure
ProcedureCDLL.l div(a.l,b.l)
wert.l = a/b
ProcedureReturn wert.l
EndProcedure
ProcedureCDLL.d multf(a.d,b.d)
wert.d = a*b
ProcedureReturn wert.d
EndProcedure
ProcedureCDLL.d divf(a.d,b.d)
wert.d = a/b
ProcedureReturn wert.d
EndProcedure
ProcedureCDLL.l adradd(*adr)
a.l =PeekL(*adr)
b.l =PeekL(*adr+4)
wert.l=a.l+b.l
ProcedureReturn wert.l
EndProcedure
ProcedureCDLL.l scrstruct(*adr)
a.l = 2468
PokeL(*adr,a.l)
b.l = 789
PokeL(*adr+4,b.l)
EndProcedure
ProcedureCDLL.l asmtest(variable)
!MOV eax, [p.v_variable]
ProcedureReturn
EndProcedure
ProcedureCDLL.l asmadd(variable ,variable1)
!MOV eax, [p.v_variable]
!add eax, [p.v_variable1]
ProcedureReturn
EndProcedure
--------------------------------------------
Dies ist das Liberty-Basic :
---------------------------------------------
OPEN "lbb_dll.dll" for dll as #handle
struct winrect, orgx as long , orgy as long
x=6789
y=107
calldll #handle, "mult" , x as long, y as long , erg as long
print(erg)
x=erg
y=107
calldll #handle, "div" , x as long, y as long , erg as long
print(erg)
print
x=2.578
y=222.532
calldll #handle, "multf" , x as double, y as double , erg as double
print(erg)
x=erg
y=222.532
calldll #handle, "divf" , x as double, y as double , erg as double
print(erg)
print
winrect.orgx.struct=7893
winrect.orgy.struct=1234
calldll #handle, "adradd" , winrect as struct , erg as long
print erg
print
calldll #handle, "scrstruct" , winrect as struct , erg as long
print winrect.orgx.struct
print winrect.orgy.struct
wait
------------------------------------------
und mit ASM aus der DLL , ist von Liberty Basic kein Unterschied :
------------------------------------------
OPEN "lbb_dll.dll" for dll as #handle
x=12345
calldll #handle, "asmtest" , x as long , erg as long
print(erg)
print
x=12345
y=1234
calldll #handle, "asmadd" , x as long , y as long , erg as long
print(erg)
wait
-----------------------------------------
Ich nehme an das dieses für Euch keine schwere Aufgabe ist.
Mit meinen 74 Jahren jetzt , tue ich mich schwer.
Ich habe im Forum keine Lösung gefunden wie das Funktioniert wenn die DLL von einem anderen Programm genutzt wird und auch mit Zeigern von Freebasic aus.
Ich möchte dann bitte diese DLL als Muster nehme für weitere Projekte.
Vielen Dank
Gruss |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
|
Nach oben |
|
|
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 06.04.2023, 12:23 Titel: |
|
|
Danke für die Hilfe.
Ich suche auch das mit dem "Alias".
Dann habe ich mal gelesen , das eine Zahl mit angegeben werden muss in Klammern beim Aufruf "4 , so ähnlich."
Gruss |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 06.04.2023, 20:47 Titel: |
|
|
arduno hat Folgendes geschrieben: | Ich suche auch das mit dem "Alias". |
Alte Technikerweisheit: "Wenn gar nichts anderes mehr hilft: Lesen Sie die Gebrauchsanweisung!"
https://www.freebasic-portal.de/befehlsreferenz/alias-37.html
oder etwas ausführlicher in der englischen Referenz: https://www.freebasic.net/wiki/KeyPgAlias
Wenn die Prozeduren in deiner dll von einem anderen Programm aufgerufen werden sollen, mußt du auf jeden Fall das Schlüsselwort EXPORT verwenden. Welche Aufrufkonvention erforderlich ist (STDCALL, CDECL oder PASCAL), hängt vom aufrufenden Programm ab (notfalls einfach ausprobieren).
Und die Parameterliste beim Aufruf ist genau so, wie sie bei der Implementierung in der dll festgelegt wurde (oder umgekehrt: Die Parameter in der dll müssen die gleichen sein, wie sie beim Aufruf vom Programm übergeben werden).
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 07.04.2023, 13:31 Titel: |
|
|
Wenn ich den Namen eingebe "addi" geht es nicht , gebe ich "addi@8" ein funktioniert es.
Was bedeutet die @8 bitte?
calldll #handle, "addi@8" , x as long, y as long , erg as long
gruss |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.04.2023, 08:04 Titel: |
|
|
Wenn ich mich nicht täusche (man darf mich da gern korrigieren), handelt es sich dabei um die Datenmenge der Parameter, die der Funktion mitgegeben werden. Die Parameter werden auf den Stack gelegt, dann der Funktionsaufruf darauf; die Funktion muss dann wissen, wie viele Werte wieder vom Stack genommen werden müssen. So oder so ähnlich - meine Assemblerkenntnisse sind eher rudimentär.
Der Aufruf addi@8 kommt mir allerdings seltsam vor, wenn drei LONG-Werte auf den Stack gelegt wurden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 09.04.2023, 17:43 Titel: |
|
|
-------------------------
Der Aufruf addi@8 kommt mir allerdings seltsam vor, wenn drei LONG-Werte auf den Stack gelegt wurden.
------------------------
Es werden nur 2 Werte auf den Stack gelegt , der 3. Wert ist das Ergebnis bei Liberty-Basic.
Gruss |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|