Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

dll erstellen mit Freebasic.

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 05.04.2023, 08:10    Titel: dll erstellen mit Freebasic. Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 05.04.2023, 18:51    Titel: Antworten mit Zitat

Hi,
keine einfache Sache. Ich kenne LibertyBasic nicht
und wie dieses Basic sich DLLs wuenscht.
Hinweise fand ich unter:
http://www.libertybasicuniversity.com/lb4help/Making_API_and_DLL_Calls.htm
https://www.freebasic-portal.de/tutorials/dll-erstellen-freebasic-24.html
http://de.wikibooks.org/wiki/FreeBasic:_DLL
..:\fb\examples\dll
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 05.04.2023, 22:56    Titel: Antworten mit Zitat

Hallo arduno,

ich habe zu diesem Thema auch schon einiges verbrochen. Vielleicht ist ja für dich etwas brauchbares dabei:
https://www.freebasic-portal.de/projekte/colochessum-84.html
https://www.freebasic-portal.de/projekte/libvlc-4-fb-101.html
https://www.freebasic-portal.de/code-beispiele/multimedia/winamp-general-purpose-plugin-274.html
https://www.freebasic-portal.de/code-beispiele/multimedia/winamp-dsp-plugin-281.html
https://forum.qbasic.at/viewtopic.php?p=111519#111519

In irgendeinem Thread habe ich auch mal an einem Beispiel erklärt, was es mit den "Alias"-Namen auf sich hat, aber das finde ich jetzt nicht.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 06.04.2023, 11:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 06.04.2023, 19:47    Titel: Antworten mit Zitat

arduno hat Folgendes geschrieben:
Ich suche auch das mit dem "Alias".

Alte Technikerweisheit: "Wenn gar nichts anderes mehr hilft: Lesen Sie die Gebrauchsanweisung!" grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 07.04.2023, 12:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.04.2023, 07:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 09.04.2023, 16:43    Titel: Antworten mit Zitat

-------------------------
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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 07.05.2023, 22:14    Titel: Antworten mit Zitat

siehe dazu übrigens auch https://www.freebasic.net/wiki/ProPgCallingConventions (englisch)
Unter Windows wird standardmäßig stdcall verwendet und dort wie in der Doku beschrieben @N als suffix hinzugefügt.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz