Forum: PC-Programmierung fremde DLL in C# importieren


von Maik (Gast)


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

von Ralf (Gast)


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

von Maik (Gast)


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?

von Sven P. (Gast)


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.

von Ralf (Gast)


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

von Arc N. (arc)


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...
1
[StructLayout(LayoutKind.Sequential)]
2
public struct Commands {
3
    ...
4
}
5
// oder 
6
[StructLayout(LayoutKind.Explicit)]
7
public struct Commands {
8
    [FieldOffset(123456789)]
9
    ...
10
}
11
12
// Aufruf 
13
Commands cmd;
14
byte[] version = ...;
15
STBL_GET(version, ref Commands cmd);

von Maik (Gast)


Lesenswert?

Danke für Eure Antworten und Hilfe,

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

viele Grüße
Maik

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.