Externe DLL einbinden

Anfängerfragen zum Programmieren mit PureBasic.
Thoene
Beiträge: 4
Registriert: 27.09.2010 14:09

Externe DLL einbinden

Beitrag von Thoene »

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.
Benutzeravatar
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

Beitrag von ts-soft »

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.
Bitte in der Hilfe unter Library und Prototypes nachlesen!

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.
Bild
Thoene
Beiträge: 4
Registriert: 27.09.2010 14:09

Re: Externe DLL einbinden

Beitrag von Thoene »

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: 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Externe DLL einbinden

Beitrag von edel »

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
Thoene
Beiträge: 4
Registriert: 27.09.2010 14:09

Re: Externe DLL einbinden

Beitrag von Thoene »

Hallo Problem gelöst!!! :D
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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Externe DLL einbinden

Beitrag von RSBasic »

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:
Bild

Sonst wird es zu unübersichtlich.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten