Hallöchen,
wir haben hier einen Kunden, der eine PCI-Karte der Firma Leetro
(MPC2810, siehe www.leetro.com) einsetzt. Die Karte ist soweit ganz nett
(4 Achsen, viele I/O-Ports usw.). Das alles soll in eine
Selbstbaumaschine (ist aber nicht unser Part).
Er kommt damit aber gar nicht zurecht und hat mich nun gebeten, der
Karte zumindest etwas zu entlocken und ihm dann zu erklären, wie er
selbst weiterkommt ...
Auch meine Antwort, dass ich schon Ewigkeiten (15 Jahre!) nicht mehr
unter Windows (erst Recht nicht mit VB) hardwarenah gearbeitet habe,
konnte ihn nicht schrecken. Toll. Kunde möchte unbedingt Basic, damit er
das später auch kann (naja ...)
Ist aber ein sehr guter Kunde und ich hab versprochen, mich da mal
hinterzuklemmen.
Es geht also vermutlich um ein klassisches DAU-Problem.
Stand im Moment: es läuft hier auf dem Testrechner ein WinXP, PCI-Karte
ist verbaut und läuft soweit mit Treiber und Demoprogrammen des
Herstellers, gibt auch messbar Schritte etc. aus.
Installiert habe ich mir hier Visual Basic 2010 Express.
Ich habe mir ein kleines Projekt erstellt und den obligatorischen Button
mit dem Click-Event und "Hallo, Welt!" gebaut. Läuft.
So, jetzt möchte ich die Hersteller-DLL (MPC2810.dll) einbinden. Der
Hersteller liefert für die Basic-Anbindung zusätzlich eine Basic-Datei,
die ich so interpretiere, dass dort quasi die Funktionsdeklarationen der
DLL stehen (siehe Anhang):
-----------
Attribute VB_Name = "FunctionDeclare"
Option Explicit
Declare Function auto_set Lib "MPC2810" () As Long
Declare Function init_board Lib "MPC2810" () As Long
usw.
-----------
Ich habe die nun in meine Klasse übernommen und rufe die beim Anklicken
des Buttons auf. Die beiden Funktionen sollten dann einmal die Anzahl
der Karten (=1) und die Anzahl der Achsen (=4) zurückgeben - stattdessen
werden zwei zufällige gigantische Zahlen zurückgegeben.
Bei anderen Funktionen der DLL erfolgt ein Speicherzugriffsfehler oder
er meldet mir Probleme mit dem Stack und bricht ebenfalls ab.
Es hat irgendwie den Anschein, als würde die DLL nicht korrekt
eingebunden.
Ich habe die DLL einfach in der Projektmappe im Projekt unter
"Hinzufügen" -> "Vorhandenes Element hinzufügen" eingebunden.
Hier der Code:
1 | Public Class Form1
|
2 | Declare Function auto_set Lib "MPC2810" () As Long
|
3 | Declare Function init_board Lib "MPC2810" () As Long
|
4 | usw.
|
5 |
|
6 | ' Button click event
|
7 | Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
|
8 | Dim a As Long
|
9 | Dim b As Long
|
10 | a = auto_set()
|
11 | b = init_board()
|
12 | MsgBox (a & " " & b)
|
13 | End Sub
|
14 | End Class
|
Bevor ich mich (wie gesagt: DAU, Beschäftigung mit VB erst seit heute)
komplett verrenne, meine Fragen:
Wie ist der korrekte Weg, eine solche DLL in VB einzubinden und zu
aktivieren, so dass ich deren Funktion nutzen kann?
Ist das Obige ok oder muss ich noch irgendetwas aktivieren?
Gibt es vielleicht Probleme, weil die DLL schon älteren Datums (2009)
ist und VB2010 etwas anderes erwartet?
Wichtig: mir geht es nicht darum, tief in VB einzusteigen - es reicht
mir vollkommen, wenn ich die Karte einfach mit den Befehlen über Basic
ansprechen kann.
Wenn mir jemand, der öfter mal Hardware in VB programmiert, helfen kann,
wäre ich wirklich sehr dankbar :-)
Chris D.