User Passwort
 Passwort speichern Passwort vergessen?
 
 
 
 Alle Foren
 PDA-Dev :: Windows Mobile
 Windows Mobile - Allgemeines
 CE API Funktionen aufrufen (P/Invoke)
Autor Vorheriges Thema Thema Nächstes Thema  

pda-dev

pda-dev

Forum Admin


554 Beiträge

Erstellt am: 15.10.2004 :  21:49:11 Uhr  Profil anzeigen  Autor eine Email senden  Besuche pda-dev's Homepage  Sende pda-dev eine ICQ Message  Antwort mit Zitat
Da gerade viele Programmierer dabei sind, von eVB (oder auch vom "richtigen" Visual Basic 6) auf VB.NET oder C# umzusteigen, beschäftigt sich dieser kleine Tipp damit, was es zu beachten gibt, wenn man API Funktionen im .NET Compact Framework benutzen will. Das Konzept nennt sich dort übrigens P/Invoke.
Um die CE API Funktionen zu deklarieren, benutzt man entweder wie bei Visual Basic 6 das Declare-Statement (nur in VB.NET) oder DLLImport sowohl in C# als auch in VB.NET.
Ein Beispiel für die Funktion FindWindow:
 
C#:
using System.Runtime.InteropServices;
[DllImport("coredll.dll")]
private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
VB.NET:
Imports System.Runtime.InteropServices
<DLLImport("coredll.dll")> _
Private Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As Intptr
End Function
 
Wenn man also eVB Anwendungen portieren will, kann man in der Regel das Declare-Statement beibehalten.
Welche Funktionen es in der Windows CE 3.0 API gibt erfährt man auf der Microsoft-Website.
Dort sind die Funktionen im Menü links nach Bereichen geordnet.
Zu jeder Funkion erfährt man ausserdem, was sie tut, welche Parameter sie erwartet und in welcher Bibliothek sie sich befindet.
Generell kann man aber sagen, dass (fast) alle CE API Funktionen in der Coredll.dll stehen.
Wenn man eine dieser Funktion nun aus einer .NET Anwednung (also "Managed Code") heraus einbinden will (PInvoke), muss man die Datentypen entsprechend anpassen. Die wichtigsten:
LPCTSTR --> String
DWORD --> Integer (32 Bit)
Wenn eine Funktion eine eigene Struktur erwartet, so muss diese in .NET als Structure oder Klasse nachgebildet werden (Links dazu siehe unten).
Der kritische Punkt für Umsteiger von eVB oder VB sind die unterschiedlichen Datentypen. Während man es als VB6-Entwickler gewohnt war, seine nativen Integer-Parameter als Long zu deklarieren, ist dies bei .NET nicht mehr der Fall. Denn:
die meisten API-Funktionen erwarten Integer-Parameter mit einer Länge von 32 Bits. In VB 6 entsprach dies dem Typ Long. Ein Integer hatte dort nur 16 Bits.
Nun, beim .NET Framework, ist es wieder so wie es eigentlich sein müsste: der Integer (bzw. int bei C#) umfasst 32 Bits und ist damit kompatibel zum nativen Integer-Datentyp. Ein Long in .NET hingegen ist starke 64 Bit lang. Das führt zu Fehlern, wenn nur 32 Bits gefordert sind.
Daraus ergibt sich, dass es meist erforderlich wird, den Long in den Deklarationen durch Integer (bzw. int) zu ersetzen.
Links zum Thema:
Drei empfehlenswerte Artikel aus dem MSDN, die sich auch tiefer mit dem Thema Marshaling (Umwandlung von .NET Datentypen in native Datentypen und umgekehrt) beschäftigen, finden sich hier, hier und hier.

Ein Computer wird nie das tun, was du willst - sondern das, was du programmierst!
   

ChriZZi

Moderator


89 Beiträge

Erstellt  am: 18.07.2006 :  16:59:59 Uhr  Profil anzeigen  Autor eine Email senden  Besuche ChriZZi's Homepage  Sende ChriZZi eine ICQ Message  Antwort mit Zitat
Hey, noch ne kleine Ergänzung zu diesem Thema, anhand des oben genannten Beispiels:
(Habe auch lange Rumprobiert, bis ichs gefunden hab!)
 
VB.NET:
<font color="blue">Imports System.Runtime.InteropServices</font id="blue">
<font color="red"><DLLImport("coredll.dll")> _
Private Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As Intptr
End Function</font id="red">
Die Import Anweisung muss vor der Class stehen. Der Rest darin, zur besseren Orientierung habe ich das ganze Farblich hervorgehoben.
<font color="blue">Imports System.Runtime.InteropServices</font id="blue">
Public Class Form1
Inherits System.Windows.Forms.Form
<font color="red"> <DllImport("coredll.dll")> _
Private Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function</font id="red">
Windows Form Designer generated code
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class

Mehr als 2 mal schütteln ist Selbstbefriedigung - H. Simpson 2007
Zum Anfang der Seite
  Vorheriges Thema Thema Nächstes Thema  
Springe nach:
 
  Bookmark & Share  
 
 
 
  Tags  
 
Keine Tags gefunden
 
 
 



pda-dev.de

Quicklinks: Foren-Übersicht | Developer-News | Suche | Impressum

© just-works! Software

Zum Anfang der Seite

Snitz Forums 2000