DevTrain Startseite Advanced Developers Conference vom 14.-15. Februar 2011  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Hannes Preishuber Artikel Drucken
        
Aufruf der API aus VB .NET

Aktueller Anlass ist der Wunsch eine serielle Schnittstelle anzusprechen. Wo ist die Klasse dafür? Es gibt sie nicht.
Meine Vermutung ist, das eine RS 232 extrem PLattformabhängig ist, und deshalb in der Base Class Library nicht vorhanden ist. Immerhin soll ja das .NET Framework portierbar sein und wo bitte ist bei meinem Handy der 9 polige Stecker?Also gehen wir auf die Suche nach alternativen. Natürlich liesse sich für obiges Problem die MSCOMM32.OCX aus VB 6 über einen Wrapper einbinden. Hier tritt allerdings wieder Performanceverlust auf um zwischen unmanaged und managed Code das Type Casting durchzuführen. Ausserdem gibt es durchaus Lizenzprobleme mit der Verwendung von Active X Controls in Visual Studio .NET. Also wenn schon .NET dann alles!

Die Funtktionen für die Steuerung der Devices wie der seriellen Schnittstelle, stecken in der Win32 API und hier wieder im Kernel. Was wir brauchen ist also ein Aufruf einer Kernerl Funktion. Wie kann es auch anders sein, das geht sehr einfach!
Dazu gibt es das Schlüsselwort DllImport. Dieses wird über eine Attributdefinition <> in die Funktion eingebaut. Der Wert des Attributs ist hier gleichzeitg der Parameter des Imports und somit der Name der DLL. Achten sie auf das einbinden des Namespaces System.Runtime.Interopservices.

Als nächstes muss dann noch die Funktion und die Paramter mit angegeben werden. Der Funktionsname und die Parameter müssen mit der Definition in der externen DLL übereinstimmen.
<DllImport("kernel32.dll")> Public Shared Sub Beep(ByVal toner As Int16, ByVal dauer As Int16)

Alternativ kann das gute alte Declare aus Vb 6 weiter verwendet werden.
Declare Sub Beep Lib "kernel32.dll" (ByVal tone As Integer, ByVal dauer As Integer)

Der Aufruf erfolgt dann, wie einer normalen Funktion.
Beep(10000,500)

Als nächstes wenden wir uns der Frage zu, was benötige ich eigentlich für Funtkionen. Eine Dokumentation der API findet man in der MSDN im Bereich Plattfrom SDK. Dazu suchen Sie nach Serial Communications in Win32.

Um für den folgenden Artikel die wichtigsten Dinge zur Hand zu haben, habe ich eine Teil der MSDN hier übernommen.

CreateFile Öffnet einen seriellen Port und liefert einen Handle
SetupComm Setzt die Parameter.
WaitCommEvent  Setzt das Wait Event
Writefile Schreibt
ReadFile Liest

Die Parameter und Events entnehmen Sie aber bitte driekt Ihrer MSDN oder über diesen Link:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/hardware/commun_2alh.asp

Daraus ergibt sich folgender Code um die nötigen Funktionen einzubinden.

<DllImport("kernel32.dll")> Private Shared Function SetCommState(ByVal hCommDev As Int32, ByRef lpDCB As DCB) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function GetCommState(ByVal hCommDev As Int32, ByRef lpDCB As DCB) As Int32
End Function
<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> Private Shared Function BuildCommDCB(<MarshalAs(UnmanagedType.LPStr)> ByVal lpDef As String, ByRef lpDCB As DCB) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function SetupComm(ByVal hFile As Int32, ByVal dwInQueue As Int32, ByVal dwOutQueue As Int32) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function SetCommTimeouts(ByVal hFile As Int32, ByRef lpCommTimeouts As COMMTIMEOUTS) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function GetCommTimeouts(ByVal hFile As Int32, ByRef lpCommTimeouts As COMMTIMEOUTS) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function ClearCommError(ByVal hFile As Int32, ByVal lpErrors As Int32, ByVal l As Int32) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function PurgeComm(ByVal hFile As Int32, ByVal dwFlags As Int32) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function EscapeCommFunction(ByVal hFile As Integer, ByVal ifunc As Long) As Boolean
 End Function
<DllImport("kernel32.dll")> Private Shared Function WaitCommEvent(ByVal hFile As Integer, ByRef Mask As Integer, ByRef lpOverlap As OVERLAPPED) As Int32
 End Function
<DllImport("kernel32.dll")> Private Shared Function WriteFile(ByVal hFile As Integer, ByVal Buffer As Byte(), ByVal nNumberOfBytesToWrite As Integer, ByRef lpNumberOfBytesWritten As Integer, ByVal lpOverlapped As Integer) As Integer
 End Function
<DllImport("kernel32.dll")> Private Shared Function ReadFile(ByVal hFile As Integer, ByVal Buffer As Byte(), ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, ByVal lpOverlapped As Integer) As Integer
 End Function
<DllImport("kernel32.dll")> Private Shared Function CreateFile(<MarshalAs(UnmanagedType.LPStr)> ByVal lpFileName As String,  ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer,  ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Integer,  ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As Integer
 End Function
 <DllImport("kernel32.dll")> Private Shared Function CloseHandle(ByVal hObject As Integer) As Integer
 End Function
<DllImport("kernel32.dll")> Private Shared Function FormatMessage(ByVal dwFlags As Integer,  ByVal lpSource As Integer, ByVal dwMessageId As Integer,  ByVal dwLanguageId As Integer,  <MarshalAs UnmanagedType.LPStr)> ByVal lpBuffer As String,  ByVal nSize As Integer, ByVal Arguments As Integer) As Integer
 End Function

Über das Attribut MarshalAs kann explizit die Datentyp umwandlung festgelegt werden.

Die Verwendung der Funktionen folgt im nächsten Artikel.


DevTrain Camp - Schneller zum .NET 3.5 Developer
 
Verwandte Artikel      Verlinkte Dokumente
    Keine verknüpften Dokumente
    Keine Links vorhanden

  Erfasst am: 19.02.2002
  Gültig bis: 21.03.2002
93 Ratings
Bewertung: 72,3%
schlecht    sehr gut  

 
© Copyright 2007 ppedv AG