簡體   English   中英

將字符串從C ++傳遞到C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM