Hallo zusammen,
ich möchte eine ältere C++ DLL in C# einbinden. Eigentlich kein großes Problem, aber es funktioniert in der Umsetzung leider nicht. Ich bin mir nicht sicher, ob ich die richtigen Datentypen nehm. Vielleicht könnt ihr mal drüber schauen:
c++.dll Header schaut wie folgt aus.
int _stdcall Connect(TCHAR *lpszVar, HANDLE& base);
int _stdcall Read (HANDLE base, TCHAR *entry, tSTR* value);
Mein DLLImport schaut in C# nun so aus.
[DllImport("c:\\base.dll", EntryPoint = "Connect")]
public static extern unsafe int Connect(string myVar, IntPtr mybase);
Den IntPtr lege ich mit Marshal.AllocCoTaskMem an, das scheint so zu funktionieren - mit dem TCHAR bin ich mir jedoch unsicher....
Probiere es mal statt "string myVar" mit "StringBuilder myVar". StringBuilder ist bei Rückgabe-Parametern notwendig.
Das unsafe kannst du eigentlich weglassen. Du benutzt keinen unsave managed Code. Stören dürfte es aber auch nicht.
Ansonsten scheint es meiner Meinung nach ok zu sein. StdCall ist die default Aufrufkonvention in DllImport. Wie äußert sich das Problem überhaupt?
Gruss
Pulpapex
Hallo
Danke für die Rasche Antwort. StringBuilder hatte ich auch schon probiert - Ohne Erfolg!
[DllImport("c:\base.dll", EntryPoint = "Connect", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi )]
public static extern unsafe int Connect(string myVar, ref IntPtr mybase);
Unklar ist allerdings TCHAR. TChar ist ein generischer Zeichentyp, je nach Compilerswitch entweder Ansi oder UniCode. Wenn es nicht funzt, dass oben bei CharSet Unicode statt Ansi verwenden.
Speicher für den Handle anlegen halte ich für unnötig. Ein Handle ist ein Int und die Routine liefert ja den Handle zurück, allokiert also selbst Speicher. Du musst ihn vermutlich nur freigeben.