C(++) DLl in C# einbinden, wie TCHAR* übergeben
-
Hi
ich habe eine DLL in C++ und möchte diese in C# verwenden. krieg ich auch eigentlich hin.
using System.Runtime.InteropServices; class Wrapper { [DllImport("mydll.dll")] public static extern int myfunc(? parameter); }
Die Funktion in der DLl erwartet aber ein TCHAR* als Parameter.
Was muss ich jetzt in C# für ? einsetzen, damit ich die Funktion verwenden kann.
-
Probiers mal mit einem string (Bin mir aber nicht sicher, und hab auch gerade kein beispiel zum es aus zu probieren).
-
[edit] Link verlegt, geposteten waren falsch[/edit]
-
Also wenn es sich um ein char* handelt geht das mit dem string aber bei TCHAR* nicht.
ich guck mir mal die Links an. edit: doch net xD
-
Ich find den link nimmer, aber das hier sollte eine guter Anhaltspunkt sein:
http://msdn2.microsoft.com/de-de/library/e8w969hb(VS.80).aspx
http://msdn2.microsoft.com/de-de/library/e8w969hb(VS.80).aspx
-
Also wenn ich die winnt.h richtig verstanden habe ist TCHAR je nach System ein Ansi oder ein Unicode Zeichen (d.h. die Länge ist zur Programmierzeit nicht bekannt).
Vielleicht hilft hier[DllImport("mydll.dll"), CharSet = CharSet.Auto]
weiter. Als Parameter dann einen String verwenden.
-
Also wenn ich die winnt.h richtig verstanden habe ist TCHAR je nach System ein Ansi oder ein Unicode Zeichen
Richtet sich nach den Compiler Optionen.
Das mit CharSet funktioniert leider auch nicht richtig, egal was ich einstell.
hab mal nen kleinen test programmiert
// myDLL.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #ifdef _MANAGED #pragma managed(push, off) #endif BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } extern "C" __declspec(dllexport) int dosth(TCHAR* text) { cout<<text; return 0; } #ifdef _MANAGED #pragma managed(pop) #endif
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Wrapper { [DllImport("myDll.dll",CharSet=CharSet.Unicode)] public static extern int dosth(string test); } class Program { static void Main(string[] args) { Wrapper.dosth("Hallo"); System.Console.ReadKey(); } } }
setze ich statt TCHAR* char* ein läuft es ohne Probleme.
edit: Die DLL ist als Unicode compiliert, es muss aber auf jedenfall laufen egal als mit welcher Zeichenbreite die DLL compiliert wurde.
edit2: omg ich depp
kein Wunder ich geb ja nen Ansi string mit cout aus kann ja nur müll rauskommen.
-
Hi,
walljumper schrieb:
edit2: omg ich depp
kein Wunder ich geb ja nen Ansi string mit cout aus kann ja nur müll rauskommen.
Klappt's jetzt? Ansonsten könntest Du noch versuchen, den String explizit als W-String zu arrangieren.
[DllImport("mydll.dll")] public static extern int myfunc([MarshalAs(UnmanagedType.LPWStr)] string parameter);
-
ich geh besser ins Bett ich meinte eigentlich Unicode statt Ansi, naja egal.
ja es geht jetzt, aber trotzdem danke vieleicht brauch ich das konstruktukt noch später in meinem Projekt.