Laden...

_stdcall - dll einbinden

Erstellt von et-thomas vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.717 Views
E
et-thomas Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren
_stdcall - dll einbinden

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....

P
939 Beiträge seit 2003
vor 18 Jahren

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

E
et-thomas Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

Hallo

Danke für die Rasche Antwort. StringBuilder hatte ich auch schon probiert - Ohne Erfolg!

S
8.746 Beiträge seit 2005
vor 18 Jahren
 
[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.