Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
_stdcall - dll einbinden
et-thomas
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

_stdcall - dll einbinden

beantworten | zitieren | melden

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....
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
et-thomas
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hallo

Danke für die Rasche Antwort. StringBuilder hatte ich auch schon probiert - Ohne Erfolg!
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

 
[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.
private Nachricht | Beiträge des Benutzers