Przechodząc ciąg z C# C++ powinny być proste. PInvoke zarządza konwersją za Ciebie.
Pobieranie ciągu znaków z C++ do C# można wykonać za pomocą StringBuilder. Musisz uzyskać długość łańcucha, aby utworzyć bufor o odpowiednim rozmiarze.
Oto dwa przykłady znanego Win32 API:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
public static string GetText(IntPtr hWnd)
{
// Allocate correct string length first
int length = GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SetWindowText(IntPtr hwnd, String lpString);
SetWindowText(Process.GetCurrentProcess().MainWindowHandle, "Amazing!");
Twój 'wykorzystanie const' jest wstecznie. –
@Ben Voigt: dzięki, naprawiłem to. – sithereal
Te przykłady eksplodowały z wyjątkami stosu w VisStudio 2012, dopóki nie dodałem cdecl do C# i C ... extern "C" __declspec (dllexport) int __cdecl SetString (... a następnie ... [DllImport (" YourLib.dlll ", CallingConvention = CallingConvention.Cdecl)] ... – user922020