[英]Passing string from C++ to C#
我正在使用Photvm,反向PInvoke方案,如Thottam R. Sriram所述http://blogs.msdn.com/b/thottams/archive/2007/06/02/pinvoke-reverse-pinvoke-and-stdcall-cdecl。 ASPX
除了將字符串從C ++傳遞給C之外,一切似乎都運行良好。
(在Sriram中,字符串是用c#構造的,並且通過c ++不受影響,所以避免了這個問題。)
c#代碼看起來像這樣
class Program
{
public delegate void callback(string str);
public static void callee(string str)
{
System.Console.WriteLine("Managed: " + str);
}
static void Main(string[] args)
{
gpscom_start(new callback(Program.callee));
Console.WriteLine("NMEA COM Monitor is running");
System.Threading.Thread.Sleep(50000);
}
[DllImport("gpscomdll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void gpscom_start(callback call);
}
C ++代碼看起來像這樣
extern "C" dllapi void __stdcall gpscom_start(void (__stdcall *callback) (BSTR str))
{
BSTR bstr = SysAllocString(L"starting monitor");
(*callback)(bstr);
SysFreeString(bstr);
運行時,除回調字符串外,一切看起來都很好
Managed: m
它看起來像是由ANSI例程打印出來的UNICODE字符串,但c#字符串肯定是unicode嗎?
TIA
在跨越P / Invoke邊界編組字符串時,最好使用具有相應字符串類型的MarshalAs
屬性。 我認為在參數上放一個[MarshalAs(UnmanagedType.BStr)]
可以解決這個問題。
public delegate void callback([MarshalAs(UnmanagedType.BStr)]string str);
本文有一個類似的例子,有人在托管和非托管代碼之間傳遞BSTR,但他在Marshal類上使用了IntPtr
和一些方法。 Marshal.PtrToStringBSTR
似乎在這里最有用。
C#字符串是UTF-16。 我建議C#可以期待LPWSTR或類似的東西,而不是BSTR。 如果您查看發布的第一個示例,他會將調用類型設置為wchar_t *,而不是BSTR。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.