摘要:C# get a string from a C++ DLL
以前在 MSDN 上的討論串,搬到這裡做備忘。範例程式碼在此:gpDllNet.rar
C++ DLL :
TCHAR g_awcMessage[] = L"Hello中文";
char g_aszMessage[] = "Hello中文";
extern "C" __declspec(dllexport) TCHAR* __stdcall GetHelloL()
{
return g_awcMessage;
}
extern "C" __declspec(dllexport) CHAR* __stdcall GetHello()
{
return g_aszMessage;
}
extern "C" __declspec(dllexport) int __stdcall GetInt()
{
return 100;
}
char g_aszMessage[] = "Hello中文";
extern "C" __declspec(dllexport) TCHAR* __stdcall GetHelloL()
{
return g_awcMessage;
}
extern "C" __declspec(dllexport) CHAR* __stdcall GetHello()
{
return g_aszMessage;
}
extern "C" __declspec(dllexport) int __stdcall GetInt()
{
return 100;
}
C# P/Invoke:
[DllImport("gpDll.dll")]
public static extern IntPtr GetHello();
[DllImport("gpDll.dll")]
public static extern IntPtr GetHelloL();
[DllImport("gpDll.dll")]
public static extern int GetInt();
private void button1_Click(object sender, EventArgs e)
{
// Not support in CF
//Marshal.PtrToStringAnsi
//Marshal.PtrToStringAuto
// Multibytes 會變成亂碼
string str = Marshal.PtrToStringUni(GetHello());
// Wide Character 顯示正常
string strL = Marshal.PtrToStringUni(GetHelloL());
int n = GetInt();
}
public static extern IntPtr GetHello();
[DllImport("gpDll.dll")]
public static extern IntPtr GetHelloL();
[DllImport("gpDll.dll")]
public static extern int GetInt();
private void button1_Click(object sender, EventArgs e)
{
// Not support in CF
//Marshal.PtrToStringAnsi
//Marshal.PtrToStringAuto
// Multibytes 會變成亂碼
string str = Marshal.PtrToStringUni(GetHello());
// Wide Character 顯示正常
string strL = Marshal.PtrToStringUni(GetHelloL());
int n = GetInt();
}