web-dev-qa-db-ja.com

DLLImportを使用してC#からC ++(およびC ++からC#)に文字列を渡す方法は?

私は長い間、C#との間で文字列を送信したり、C++から文字列を送信したりしてきましたが、まだ機能していません...

だから私の質問は簡単です:
C#からC++に、およびC++からC#に文字列を送信する方法を誰かが知っていますか?
(いくつかのサンプルコードが役立つでしょう)

21
Jsncrdnl

C#からC++への文字列の受け渡しは簡単です。 PInvokeが変換を管理します。

C++からC#への文字列の取得は、StringBuilderを使用して行うことができます。正しいサイズのバッファを作成するには、文字列の長さを取得する必要があります。

以下は、よく知られているWin32 APIの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!");
12
Samy Arous

あなたの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);
21
sithereal

Windows APIで発生する多くの関数は、文字列または文字列型のパラメーターを受け取ります。これらのパラメーターに文字列データ型を使用する場合の問題は、.NETの文字列データ型は一度作成すると不変であるため、ここではStringBuilderデータ型が正しい選択であることです。例として、API関数GetTempPath()を調べます

Windows API定義

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);
1
noonand