私は長い間C#とC ++から文字列を送信しようとしていましたが、まだ機能させることができませんでした...
だから私の質問は簡単です:
C#からC ++へ、そしてC ++からC#へ文字列を送信する方法を知っている人はいますか?
(いくつかのサンプルコードが役立ちます)
あなたのCコードで:
extern "C" __declspec(dllexport)
int GetString(char* str)
{
}
extern "C" __declspec(dllexport)
int SetString(const char* str)
{
}
.net側:
using System.Runtime.InteropServices;
[DllImport("YourLib.dll")]
static extern int SetString(string someStr);
[DllImport("YourLib.dll")]
static extern int GetString(StringBuilder rntStr);
利用方法:
SetString("hello");
StringBuilder rntStr = new StringBuilder();
GetString(rntStr);
C#からC++への文字列の受け渡しは簡単です。PInvokeが変換を管理します。
C ++からC#への文字列の取得は、StringBuilderを使用して実行できます。正しいサイズのバッファを作成するには、文字列の長さを取得する必要があります。
よく知られているWin32APIの2つの例を次に示します。
[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!");
Windows APIで検出される多くの関数は、文字列または文字列タイプのパラメータを取ります。これらのパラメーターに文字列データ型を使用する場合の問題は、.NETの文字列データ型は一度作成されると不変であるため、ここではStringBuilderデータ型が正しい選択であるということです。例として、API関数GetTempPath()を調べます。
WindowsAPIの定義
DWORD WINAPI GetTempPath(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);
.NETプロトタイプ
[DllImport("kernel32.dll")]
public static extern uint GetTempPath
(
uint nBufferLength,
StringBuilder lpBuffer
);
使用法
const int maxPathLength = 255;
StringBuilder tempPath = new StringBuilder(maxPathLength);
GetTempPath(maxPathLength, tempPath);