Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 23.02.2010, 20:05 Titel: DLL |
|
|
Hallo,
ich habe ein Beispiel für eine DLL die mit PowerBasic erstellt worden ist.
Jetzt ist meine Frage ob sich so was auch mit FreeBasic realisieren lässt und
wenn ja wie stellt man das an.
Ich hab schon etwas getestet aber irgendwie bin ich noch auf dem Holzweg.
Bis dann
habe
Hier das PowerBasic Beipiel:
------------------------------------------------------------------------------------
#COMPILE DLL
#DIM ALL
%USEMACROS = 1
#INCLUDE "Win32API.inc"
GLOBAL ghInstance AS DWORD
'-------------------------------------------------------------------------------
' Main DLL entry point called by Windows...
'-------------------------------------------------------------------------------
FUNCTION LIBMAIN (BYVAL hInstance AS LONG, _
BYVAL fwdReason AS LONG, _
BYVAL lpvReserved AS LONG) AS LONG
SELECT CASE fwdReason
CASE %DLL_PROCESS_ATTACH
ghInstance = hInstance
FUNCTION = 1 'success!
'FUNCTION = 0 'failure! This will prevent the EXE from running.
CASE %DLL_PROCESS_DETACH
FUNCTION = 1 'success!
'FUNCTION = 0 'failure!
CASE %DLL_THREAD_ATTACH
FUNCTION = 1 'success!
'FUNCTION = 0 'failure!
CASE %DLL_THREAD_DETACH
FUNCTION = 1 'success!
'FUNCTION = 0 'failure!
END SELECT
END FUNCTION
'Alles was bis hier steht wird von PowerBasic erstellt
'-----------------------------------------------------------------
'-----------------------------------------------------------------
'AB HIER BEGINNEN DIE PROFI LAB ROUTINEN
FUNCTION NumInputs SDECL ALIAS "NumInputs" () EXPORT AS BYTE
FUNCTION = 1 'Die DLL hat 1 Eingangspin
END FUNCTION
FUNCTION NumOutputs SDECL ALIAS "NumOutputs" () EXPORT AS BYTE
FUNCTION = 1 'Die DLL hat 1 Ausgangspin
END FUNCTION
SUB GetInputName SDECL ALIAS "GetInputName" (BYVAL Channel AS BYTE, InputName AS ASCIIZ) EXPORT
InputName = "E1" 'Der Eingangspin bekommt die Beschriftung E1
END SUB
SUB GetOutputName SDECL ALIAS "GetOutputName" (BYVAL Channel AS BYTE, OutputName AS ASCIIZ) EXPORT
OutputName = "A1" 'Der Ausgangspin bekommt die Beschriftung A1
END SUB
SUB CCalculate SDECL ALIAS "CCalculate" (PInput0 AS DOUBLE , POutput0 AS DOUBLE, PUser0 AS DOUBLE) EXPORT
LOCAL PInput AS DOUBLE PTR
LOCAL POutput AS DOUBLE PTR
LOCAL PUser AS DOUBLE PTR
PInput = VARPTR(PInput0)
POutput = VARPTR(POutput0)
PUser = VARPTR(PUser0)
IF @PInput[0] >= 2.5 THEN @POutput[0] = 5 ELSE @POutput[0] = 0
END SUB |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 23.02.2010, 21:16 Titel: |
|
|
Mit FreeBASIC lassen sich DLLs sogar recht einfach erstellen, allerdings wenn ich den Code sehe, muss ich dir erst raten, dich mit der Syntax von FB vertraut zu machen: FB <> PB!
Für die Compilierung einer DLL brauchst du unter anderem die Compileroption -dll, mit #Compile DLL wird es leider nichts. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 23.02.2010, 21:49 Titel: |
|
|
Hallo,
danke für deine Antwort, mein erster Eintrag und schon eine Frage.
Das mit der Compileroption –dll hab ich schon herausgefunden.
Gibt es für FreeBasic so eine Art win32.api? Es können ja *.bi Dateien über die #Include Anweisung mit Eingebunden werden. Bei PowerBasic gibt es dann ja auch noch die die Funktion LIBMAIN (MainDLL) die ja von Windows angesprungen wird, sobald die DLL aufgerufen wird.
Kurz gesagt gibt es ein Grundgerüst wie eine DLL in FreeBasic aussehen muss.
Bis dann
habe |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 23.02.2010, 22:04 Titel: |
|
|
Im Installationsverzeichnis von FB findest du den Ordner "examples" und darin den Ordner "dll".
Da gibt es das einfachste Beispiel für die Verwendung von DLLs in FB. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 23.02.2010, 22:41 Titel: |
|
|
Hallo,
so hab mal das Beispiel aus dem Installationsverzeichnis von FB genommen.
Bekomme aber beim compilieren (fbc -dll) folgenden Fehler:
cannot find -lmydll
Wo liegt der Fehler?
Hier mein Code:
----------------------------------------------------------------------------------
#Include "windows.bi"
#Include "mydll.bi"
dim shared hInstance as long
''
'' note: do not add any executable code to the main module (ie: outside
'' any function), because that code will never be executed as only DllMain
'' is invoked by Windows at the initialization
''
''::::::
''
'' DllMain is the entry-point (ALWAYS needed with DLL's), don't change the prototype
''
function DllMain ( byval hModule as long, byval reason as long, byval lpReserved as long ) as integer
select case reason
case DLL_PROCESS_ATTACH
hInstance = hModule
case DLL_THREAD_ATTACH, DLL_THREAD_DETACH, DLL_PROCESS_DETACH
end select
DllMain = TRUE
end function
FUNCTION NumInputs () As BYTE EXPORT
FUNCTION = 1 'Die DLL hat 1 Eingangspin
END FUNCTION
FUNCTION NumOutputs() As BYTE EXPORT
FUNCTION = 1 'Die DLL hat 1 Ausgangspin
END FUNCTION
SUB GetInputName (BYVAL Channel AS BYTE, InputName AS String) Export
InputName = "E1" 'Der Eingangspin bekommt die Beschriftung E1
END SUB
SUB GetOutputName (BYVAL Channel AS BYTE, OutputName AS string) Export
OutputName = "A1" 'Der Ausgangspin bekommt die Beschriftung A1
END SUB
SUB CSimStart (PInput0 AS DOUBLE, POutput0 AS DOUBLE, PUser0 AS DOUBLE) EXPORT
END SUB
SUB CSimStop (PInput0 AS DOUBLE, POutput0 AS DOUBLE, PUser0 AS DOUBLE) Export
END SUB
SUB CCalculate (PInput0 AS DOUBLE , POutput0 AS DOUBLE, PUser0 AS DOUBLE) Export
Dim PInput AS DOUBLE PTR
Dim POutput AS DOUBLE PTR
dim PUser AS DOUBLE PTR
PInput = VARPTR(PInput0)
POutput = VARPTR(POutput0)
PUser = VARPTR(PUser0)
IF PInput[0] >= 2.5 THEN POutput[0] = 5 ELSE POutput[0] = 0
END SUB |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 23.02.2010, 23:09 Titel: |
|
|
Also ich erklär erstmal, was das Beispiel zeigt:
Die Datei "mydll.bas" ist die Codedatei, die per "-dll" zur "mydll.dll" compiliert wird.
"mydll.bi" ist die Headerdatei zu dieser DLL um die Funktionen in eigene Projekte einbinden zu können.
Die Testdateien zeigen dann, wie diese dann verwendet wird.
Du versuchst also die Headerdatei zu dieser mydll.dll einzubinden ohne das die DLL vorhanden ist. Das ist also genau das, was du mit deinem Code nicht bezecken willst, du willst schließlich eine DLL erzeugen und keine einbinden.
Die "windows.bi" brauchst du dafür übrigens auch nicht.
Diesen Einstiegspunkt wie bei PB gibt es auch so nicht, die DLL wird dadurch eingebunden, dass man die Funktionen bekannt macht und das eben mit "Export".
Wenn du die DLL dann noch verwenden willst, musst du zu den exportierten Funktionen/zu dieser DLL einen Header schreiben (.bi bei FB), die du dann einbindest bzw. über DyLibLoad usw. einzeln einbinden.
Am besten schaust du dir die Beispieldateien nochmal an. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 24.02.2010, 14:54 Titel: |
|
|
Hallo,
dann wird es für mein Vorhaben wohl nicht gehen, weil die DLL von einem anderen Programm aufgerufen wird. Dort kann ich keine Header schreiben.
habe |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.02.2010, 17:38 Titel: |
|
|
Die meisten Libs geben Header mit, sonst könnte sie ja keiner einbinden. Um was genau handelt es sich denn? Erklär mal, was du vor hast. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 24.02.2010, 18:12 Titel: |
|
|
Hallo,
ich arbeite mit dem Programm ProfiLab von der Firma Abacom. Mit diesem Programm kann man auf einfachster Weise Messtechnik- und Steuerungsprojekte erstellen. In dem Programm gibt es die Möglichkeit mithilfe eines DLL-Import’s, eigene Bausteine zu programmieren.
Folgende Funktionen müssen u.a. von der selbst erstellten DLL übergeben werden, um von ProfiLab erkannt zu werden:
- Function NumInputs ( ) as Byte
- Function NumOutputs ( ) as Byte
usw.
Mit PowerBasic geht es, das weis ich.
Ich hab aber jetzt festgestellt das FB an den Exportierten Funktionen immer ein @“Zahl“ dranhängt und deshalb die Funktionen der DLL von PL wohl nicht erkannt werden.
Gibt es eine Möglichkeit diesen @ Anhang wegzubekommen?
habe |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.02.2010, 18:26 Titel: |
|
|
Du willst also doch eine DLL erstellen und keine Einbinden in dein FB-Programm.
Ich kenn das Programm nicht, aber ich vermute, dass du dann nur die entprechenden zwei Funktionen mit "export" nach außen geben musst und alle anderen nicht.
Edit: Vielleicht hilft dir das weiter - http://www.mikrocontroller.net/topic/58932 |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 24.02.2010, 18:35 Titel: |
|
|
Hallo,
ja ich will eine DLL erstellen, hab mich da vielleicht etwas blöde ausgedrückt, sorry.
Also die DLL kann bis zu 9 Funktionen/Prozeduren übergeben, je nach dem was man braucht. Ich denke aber es wird nicht gehen da die FB-DLL immer dieses @ mit einer Zahl dranhängt, dadurch werden diese Funktionen nicht vom Programm erkannt. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.02.2010, 19:08 Titel: |
|
|
Eine FB-DLL unterscheidet sich nicht von einer Deplhi-DLL oder C-DLL. Jede Sprache muss sich an die Eigenheiten des Betriebssystems halten. Da ich aus Erfahrung weiß, dass FB-DLLs unter Win funktionieren, sind es normale DLLs.
Das @ ist dabei auch normal und zeigt den Einsprungspunkt für diese Funktion in der DLL. Hat jede andere DLL auch. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 24.02.2010, 19:52 Titel: |
|
|
Habe jetz mal versucht ein FB-DLL in eine PowerBasic DLL zu integrieren. Wenn ich das @ weglasse meckert PowerBasic beim Kompilieren, hänge ich es dran dann geht es.  |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.02.2010, 20:07 Titel: |
|
|
Wo hängst du das dran? Normalerweise musst du dich um das @ nicht kümmern.
Ich sag es mal so, wenn es mit PB geht, geht es 100pro auch mit FB und wenn es scheitert, dann liegt es nicht an FB.
Versuch erstmal, die Grundlagen von DLLs in FB zu lernen, am besten durch probieren, da lernt man am meisten.
Wenn das mal klappt mit erstellen und einbinden, dann kannst du dich daran machen, dein Plugin für ProfiLab zu erstellen. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 24.02.2010, 22:24 Titel: |
|
|
Der Beitrag stammt von 2005 und FB hat sich seitdem doch etwas verändert.
Im Projektforum gibt es eine Lib von mir, "mdprocess", die ich mit FB geschrieben habe und die ich auch problemlos in C-Projekte einbinden konnte.
Einzig mit dem String-Datentyp kann es bei exportierten Funktionen zu problemen kommen, da dieser in FB kein Datentyp sondern eher ein UDT ist. Deswegen verwende ich ZStrings. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.02.2010, 12:06 Titel: |
|
|
Zitat: | Der Beitrag stammt von 2005... | und im nächsten Beitrag wird erklärt warum es doch möglich ist für andere Anwendungen DLLs in FB zu schreiben.
Ist mir in vielen Fällen auch gut gelungen
Hier habe ich aber auch keinen Durchblick was ProfiLab in einer DLL erwartet.
Das fängt bei SDECL an, scheint aber in PB Zitat: | SDECL (and its synonym STDCALL) specifies that the declared procedure uses the "Standard Calling Convention" as defined by Microsoft. |
Auch keine Antworten unter http://forum.abacom-online.de/phpBB3/viewtopic.php?f=31&t=783 oder
http://forum.abacom-online.de/phpBB3/viewtopic.php?f=21&t=1409 ?
Eine Frage; woher kennt ProfiLab die Einsprungstellen in die DLL-Routinen, wenn das nirgens angegeben werden muß?
( die Zahl nach dem @ gibt die Anzahl der Byte die auf dem Stack belegt werden und auch freigegeben werden müssen.) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 25.02.2010, 21:55 Titel: |
|
|
Tach,
hab’s jetzt hinbekommen. Habe die kompilierte DLL mit einem Hexeditor geöffnet und das @ und die Zahl durch 00 ersetzt. Jetzt werden die exportierten Funktionen von ProfiLab erkannt. So wie ich das bis jetzt Testen konnte, funktioniert eigentlich alles außer die Sub’s wo Strings verarbeitet werden. In PowerBasic werden die Strings als ASCIIZ übergeben. Also als nullterminierten String fester Länge.
Allen noch mal Danke für euere Hilfe
habe |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.02.2010, 22:28 Titel: |
|
|
Zitat: | Habe die kompilierte DLL mit einem Hexeditor geöffnet und das @ und die Zahl durch 00 ersetzt | Das kann ja nicht das "gelbe vom Ei" sein.
Versuch mal ob es mit CDECL SUBs geht, da werden keine @X hinter die Namen gesetzt.
Code: | Declare Sub CSimStop CDECL Alias "CSimStop" (PInput0 As Double, POutput0 As Double, PUser0 As Double)
....
Sub CSimStop Cdecl(PInput0 As Double, POutput0 As Double, PUser0 As Double) Export
'Diese Routine wird beim beenden des RUN-Modus eines ProfiLab-Projekt aufgerufen
'und kann z.B. um geöffnete Dateien zu schliessen, etc
End Sub
|
ASCIIZ ist nullterminierter String variabler Länge, in FB ist das ZSTRING. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
habe
Anmeldungsdatum: 23.02.2010 Beiträge: 17
|
Verfasst am: 25.02.2010, 22:40 Titel: |
|
|
Suuuuper es funzt danke danke danke, wenn du jetzt noch ein tip für die Strings hast bist du der größte.
Hab es nochmal getestet. Die Funktionen werden jetzt zwar übernommen, hab allerdings jetzt eine Fehlermeldung. Ich teste aber weiter.
Zuletzt bearbeitet von habe am 25.02.2010, 22:46, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
|