Ich benutze schon länger Power-Basic und möchte auch in Pure-Basic einsteigen.
Ich möchte ein funktionierendes Programm in PB konvertieren und habe Problem mit Aufruf der DLL
für die externen USB Device
Wie binde ich eine DLL einer Externen Komponente in Pure Basic ein???
Benutze von Code Mercenaries ein USB I/O-Controller IO-Warrior40
Ich will die Funktionen – Subs Deklarieren:
Unten die Declarationen in VB 6.0 und Power-Basic für Öffnen, Schließen, Schreiben und Lesen
Wie ist die Syntax in PB?? Ich benutze PB 4.51
---------------------------------------------------------------------------------------------------------
In VB 6.0 Device Öffnen
Public Declare Function IowKitOpenDevice Lib "iowkit" () As Long
In Power Basic
DECLARE FUNCTION IowKitOpenDevice LIB "iowkit.dll" ALIAS "IowKitOpenDevice"() AS LONG
---------------------------------------------------------------------------------------------------------
In VB 6.0 Device Schließen
Public Declare Sub IowKitCloseDevice Lib "iowkit" (ByVal iowHandle As Long)
In Power Basic
DECLARE SUB IowKitCloseDevice LIB "iowkit.dll" ALIAS "IowKitCloseDevice" (BYVAL iowHandle AS_ LONG)
---------------------------------------------------------------------------------------------------------
In VB 6.0 Schreiben in Device
Public Declare Function IowKitWrite Lib "iowkit" (ByVal iowHandle As Long, _
ByVal numPipe As Long, ByRef buffer As Byte, ByVal length As Long) As Long
In Power Basic
DECLARE FUNCTION IowKitWrite LIB "iowkit.dll" ALIAS "IowKitWrite" (BYVAL iowHandle AS LONG, _
BYVAL numPipe AS LONG, BYREF buffer AS BYTE, BYVAL length AS LONG) AS LONG
---------------------------------------------------------------------------------------------------------
In VB 6.0 Lesen aus Device
Public Declare Function IowKitRead Lib "iowkit" (ByVal iowHandle As Long, _
ByVal numPipe As Long, ByRef buffer As Byte, ByVal length As Long ) As Long
In Power Basic
DECLARE FUNCTION IowKitRead LIB "iowkit.dll" ALIAS "IowKitRead" (BYVAL iowHandle AS LONG, _
BYVAL numPipe AS LONG, BYREF buffer AS BYTE, BYVAL length AS LONG) AS LONG
Programierbeispiel in Power-Basic
DIM iowHandles(16) AS GLOBAL LONG ‘ Dimensionieren“ iow Handles“ mit 16 Elementen als Long
DIM Daten(8) AS GLOBAL BYTE ‘Dimensionieren „Daten“ mit 8 Elementen als Byte
GLOBAL Res AS LONG 'Dimensionieren “Res” Rückgabewert Funktion als Long
iowHandles(0) = IowKitOpenDevice() 'IO-Warrior öffnen + Schreiben
Daten(0) = 0 : Daten(1) =23 ‘Zahl 23 als Bitmuster Port 0 ausgeben
Res = IowKitWrite(iowHandles(0), 0, Daten(0), 5)'Nach IOW schreiben ‘ 5 Byte schreiben
Daten(0) = 0 : Daten(4) = 255 ‘Port 3 als Ausgang
Res = IowKitWrite(iowHandles(0), 0, Daten(0), 5)'Nach IOW schreiben ‘ 5 Byte schreiben
Res = IowKitRead(iowHandles(0),0, Daten(0), 5) 'Von IOW lesen‘ 5 Byte lesen
Ergebnis = Daten(4) ‘Bitmuster von Port 3
Vielen Dank in voraus.
Externe DLL einbinden
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Externe DLL einbinden
Code: Alles auswählen
Prototype.l IowKitOpenDevice()
Prototype.l IowKitCloseDevice(iowHandle.l)
Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l
Global IowKitOpenDevice.IowKitOpenDevice
Global IowKitCloseDevice.IowKitCloseDevice
Global IowKitWrite.IowKitWrite
If OpenLibrary(0, "iowkit.dll")
IowKitOpenDevice = GetFunction(0, "IowKitOpenDevice")
IowKitCloseDevice = GetFunction(0, "IowKitCloseDevice")
IowKitWrite = GetFunction(0, "IowKitWrite")
EndIf
Define iowHandle.l
iowHandle = IowKitOpenDevice()
; usw.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Externe DLL einbinden
Vielen Dank für die schnelle Hilfe. Habe das nachfolgende Programm an die Hilfestellung angepasst aber
beim Start meines nachstehenden Programm wird 255 aus dem Array Daten(4) angezeigt aber keine Eingangspegel
vom Port3.
Der Button ist nicht sichtbar und der Mauszeiger erscheint als Eieruhr. Das Programm hängt und kann nur durch
mehrmaliges drücken des Systembutton (x) abgebrochen werden.
Der Kompiler meldet sich mit: The debugged executable quit unexpectedly.
Was ich nicht verstehe in der Programmzeile "Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l)"
Was bedeutet *buffer Muss das nicht heißen Buffer.a als Byte? Es werden über das Array Daten 5 Byte an das
Device geschrieben oder gelesen.
Mein Programmcode:
__________________________________________________
Code-Tags hinzugefügt
29.09.2010
RSBasic
beim Start meines nachstehenden Programm wird 255 aus dem Array Daten(4) angezeigt aber keine Eingangspegel
vom Port3.
Der Button ist nicht sichtbar und der Mauszeiger erscheint als Eieruhr. Das Programm hängt und kann nur durch
mehrmaliges drücken des Systembutton (x) abgebrochen werden.
Der Kompiler meldet sich mit: The debugged executable quit unexpectedly.
Was ich nicht verstehe in der Programmzeile "Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l)"
Was bedeutet *buffer Muss das nicht heißen Buffer.a als Byte? Es werden über das Array Daten 5 Byte an das
Device geschrieben oder gelesen.
Mein Programmcode:
Code: Alles auswählen
OpenWindow(0,0,0,1275,775,"Window",#PB_Window_SystemMenu) ;x,OL,OO,RU,UU,Text
ButtonGadget(0,20,20,140,40,"Button")
If LoadFont(0, "Arial", 16)
SetGadgetFont(#PB_Default, FontID(0)) ; geladenen Arial 16 Zeichensatz als neuen Standard festlegen
EndIf
TextGadget(1, 40, 140, 80, 20, "Test")
SetGadgetColor(1, #PB_Gadget_BackColor, $00FFFF)
If LoadFont(1,"Courier",10, #PB_Font_Bold|#PB_Font_Underline)
SetGadgetFont(#PB_Default, FontID(1)) ; geladenen Courier 10 Zeichensatz als neuen Standard festlegen
EndIf
Prototype.l IowKitOpenDevice()
Prototype.l IowKitCloseDevice(iowHandle.l)
Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l)
Prototype.l IowKitRead(iowHandle.l, numPipe.l, *buffer, length.l)
Prototype.l IowKitReadNonBlocking(iowHandle.l, numPipe.l, *buffer, length.l)
Prototype.l IowKitReadImmediate(iowHandle.l, Value.l)
Prototype.l IowKitGetNumDevs()
Prototype.l IowKitGetDeviceHandle(numDevice.l)
Global IowKitOpenDevice.IowKitOpenDevice
Global IowKitCloseDevice.IowKitCloseDevice
Global IowKitWrite.IowKitWrite
Global IowKitRead.IowKitRead
Global IowKitReadNonBlocking.IowKitReadNonBlocking
Global IowKitReadImmediate.IowKitReadImmediate
Global IowKitGetNumDevs.IowKitGetNumDevs
Global IowKitGetDeviceHandle.IowKitGetDeviceHandle
Global Dim Daten.a(8)
Define iow.l
Define Res.l
If OpenLibrary(0, "iowkit.dll")
IowKitOpenDevice = GetFunction(0, "IowKitOpenDevice")
IowKitCloseDevice = GetFunction(0, "IowKitCloseDevice")
IowKitWrite = GetFunction(0, "IowKitWrite")
IowKitRead = GetFunction(0, "IowKitRead")
IowKitReadNonBlocking = GetFunction(0, "IowKitReadNonBlocking")
IowKitReadImmediate = GetFunction(0, "IowKitReadImmediate")
IowKitGetNumDevs = GetFunction(0, "IowKitGetNumDevs")
IowKitGetDeviceHandle = GetFunction(0, "IowKitGetDeviceHandle")
EndIf
iow = IowKitOpenDevice()
Repeat
Daten(0) = 0 ;Normalmodus
Daten(1) = 255 ;Port 0 Eingang Messdaten Einer + Zehner
Daten(2) = 255 ;Port 1 Eingang Messdaten Hunderter + Tausender
Daten(3) = 255 ;Port 2 Eingang Messdaten Bit0 = Zehntausender + Rest
Daten(4) = 255 ;Port 3 Eingang Taster
;Setzen Normalmodus und Port 0-3 als Eingang
Res = IowKitWrite(iow, 0, Daten(0), 5) ;5 Bytes nach IOW schreiben
Delay(300)
;Lesen 4 Byte von Port 0-3
Res = IowKitRead(iow, 0, Daten(0), 5) ;5 Bytes vom IOW lesen
;Ausgabe Wert von Byte 4 = Port3 als 0-255
SetGadgetText(1, StrU(Daten(4), #PB_Byte))
Delay(300)
Until event=#PB_Event_CloseWindow
IowKitCloseDevice(iow)
End
__________________________________________________
Code-Tags hinzugefügt
29.09.2010
RSBasic
Re: Externe DLL einbinden
in der Schleife musst du das Event erst abfragen
Code: Alles auswählen
repeat
event = waitwindowevent(1)
if event = 0
; hier dein zeugs
endif
until event = #pb_event_closewindow
Re: Externe DLL einbinden
Hallo Problem gelöst!!!
Habe im IO-Warior Forum Lösung gefunden. Anbei ein Funktionierendes Testprogramm
Es wird der Pegel des Eingangsport 3 als Byte angezeigt.
Gleichzeitig werden die Zyklen gezählt, bei mir ca. 125 Messungen / Sekunde
Es werden im Spezialmode die Eingangspegel kontinuierlich gemessen.
__________________________________________________
Code-Tags hinzugefügt
30.09.2010
RSBasic

Habe im IO-Warior Forum Lösung gefunden. Anbei ein Funktionierendes Testprogramm
Es wird der Pegel des Eingangsport 3 als Byte angezeigt.
Gleichzeitig werden die Zyklen gezählt, bei mir ca. 125 Messungen / Sekunde
Es werden im Spezialmode die Eingangspegel kontinuierlich gemessen.
Code: Alles auswählen
OpenWindow(0,0,0,1275,775,"Window",#PB_Window_SystemMenu)
ButtonGadget(0,20,20,140,40,"Button")
If LoadFont(0, "Arial", 16)
SetGadgetFont(#PB_Default, FontID(0)) ; geladenen Arial 16 Zeichensatz als neuen Standard festlegen
EndIf
TextGadget(1, 40, 140, 80, 20, "Test")
SetGadgetColor(1, #PB_Gadget_BackColor, $00FFFF)
TextGadget(2, 80, 200, 80, 20, "Test")
SetGadgetColor(2, #PB_Gadget_BackColor, $00FFFF)
If LoadFont(1,"Courier",10, #PB_Font_Bold|#PB_Font_Underline)
SetGadgetFont(#PB_Default, FontID(1)) ; geladenen Courier 10 Zeichensatz als neuen Standard festlegen
EndIf
Import "iowkit.lib"
IowKitOpenDevice() As "_IowKitOpenDevice@0"
IowKitCloseDevice(devHandle.i) As "_IowKitCloseDevice@4"
IowKitGetNumDevs() As "_IowKitGetNumDevs@4"
IowKitGetDeviceHandle(devHandle.i) As "_IowKitGetDeviceHandle@4"
IowKitRead(devHandle.i, numPipe.l, buffer.l, length.l) As "_IowKitRead@16"
IowKitWrite(devHandle.i, numPipe.l, buffer.l, length.l) As "_IowKitWrite@16"
IowKitGetProductId(ioHandle) As "_IowKitGetProductId@4"
IowKitGetRevision(ioHandle) As "_IowKitGetRevision@4"
IowKitGetSerialNumber(ioHandle, Serial.s) As "_IowKitGetSerialNumber@8"
IowKitReadImmediate(ioHandle,buffer.s) As "_IowKitReadImmediate@8"
EndImport
Structure bufferByte
buffer1.c
buffer2.c
buffer3.c
buffer4.c
buffer5.c
buffer6.c
buffer7.c
buffer8.c
EndStructure
Define.bufferByte buffer
Define.l ioHandle
Define.l Zaehler
numPipe = 1
length = 8
IowKitOpenDevice()
ioHandle = IowKitGetDeviceHandle(1)
Repeat
event = WaitWindowEvent(1)
If event = 0
buffer\buffer1 = 255
buffer\buffer2 = 255
buffer\buffer3 = 255
buffer\buffer4 = 255
buffer\buffer5 = 255
IowKitWrite(ioHandle, numPipe,buffer,length)
IowKitRead(ioHandle, numPipe,buffer,length)
SetGadgetText(1, StrU(buffer\buffer5, #PB_Byte))
SetGadgetText(2, StrU(Zaehler, #PB_Long))
Zaehler = Zaehler + 1
EndIf
Until event=#PB_Event_CloseWindow
IowKitCloseDevice(iohandle)
End
__________________________________________________
Code-Tags hinzugefügt
30.09.2010
RSBasic
Re: Externe DLL einbinden
Hallo Thoene,
wenn du einen Quellcode posten möchtest, verwende bitte zukünftig die Code-Tags, indem du dein Code markierst und auf den folgenden Button klickst:

Sonst wird es zu unübersichtlich.
wenn du einen Quellcode posten möchtest, verwende bitte zukünftig die Code-Tags, indem du dein Code markierst und auf den folgenden Button klickst:

Sonst wird es zu unübersichtlich.