mikrocontroller.net

Forum: PC-Programmierung fremde DLL in C# importieren


Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche eine Funktion aus einer fremdem DLL in mein c# Projekt zu 
importieren.
Dabei tauchen in der Funktionsübergabe aber Strukturen und ein LPBYTE 
auf. Dies ist in der Header-Datei definiert (bis auf LPBYTE). Die Header 
Datei kann ich in C# nicht einbinden. Wie gehe ich da weiter vor?

//So ist die Funktion in der Lib angegeben
STBLLIB_API BYTE STBL_GET(LPBYTE Version, LPCommands pCmds);

//So möchte ich sie importieren
[DllImport("STBLLIB.dll")]
public static extern byte STBL_GET(byte[] Version, LPCommands pCmds);

wie komme ich an LPBYTE und LPCommands?

Gruß
Maik

P.S. IDE: Visual C# 2005 Express Edition

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LPBYTE dürfte dem Namen nach ein Long-Pointer auf ein Char(-Array) sein, 
LPCommands könnte das gleiche sein, ein Char(-Array), in dem Kommandos 
abgespeichert sind.

Ralf

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Deine Antwort. Das hilft mir aber leider nicht weiter. Ich 
muss wissen wie ich das meinem Code bekannt mache. Also wie die Header 
Datei bekannt machen?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.pinvoke.net/

Schau mal da, ob du Anhaltspunkte findest (nach Typenpräfix der 
Argumente suchen), wie man den Managed-Blödsinn austricksen kann.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich müsst jetzt erstmal auf der Festplatte rumwühlen, bei einem Versuch, 
die FTDI-DLLs in C# einzubinden, hatte ich das gleiche Problem, was sich 
mit der IntPtr-Struktur aus C# einwandfrei lösen lies.
In deinem Fall dürfte das auch funktionieren, anstatt LPBYTE gibst du 
als Typ einfach IntPtr an. Die genaue Verwendung musst du in der 
Dokumentation zum .NET FrameWork nachlesen.

Ralf

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maik wrote:
> wie komme ich an LPBYTE und LPCommands?

LPBYTE wurde schon erklärt, LPCommands muss irgendwo in den Headern der 
DLL definiert sein -> die Struktur zu LPCommands finden und in C# 
passend nachbilden...
[StructLayout(LayoutKind.Sequential)]
public struct Commands {
    ...
}
// oder 
[StructLayout(LayoutKind.Explicit)]
public struct Commands {
    [FieldOffset(123456789)]
    ...
}

// Aufruf 
Commands cmd;
byte[] version = ...;
STBL_GET(version, ref Commands cmd);

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Antworten und Hilfe,

ich glaube so komme ich weiter. Ich werds mal antesten.

viele Grüße
Maik

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.