Đi qua chuỗi từ C# C++ nên thẳng về phía trước. PInvoke sẽ quản lý việc chuyển đổi cho bạn.
Nhận chuỗi từ C++ đến C# có thể được thực hiện bằng cách sử dụng một StringBuilder. Bạn cần lấy độ dài của chuỗi để tạo bộ đệm có kích thước chính xác.
Dưới đây là hai ví dụ về một Win32 API nổi tiếng:
[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!");
Nguồn
2012-05-29 13:06:42
'sử dụng const' của bạn là ngược. –
@Ben Voigt: cảm ơn, đã sửa nó. – sithereal
Những ví dụ này phát nổ với ngăn xếp ngoại lệ trong VisStudio 2012 cho đến khi tôi thêm cdecl vào cả C# và C .... extern "C" __declspec (dllexport) int __cdecl SetString (... và sau đó ... [DllImport (" YourLib.dlll ", CallingConvention = CallingConvention.Cdecl)] ... – user922020