2013-07-30 102 views
1

我在我的C++/CLI項目中有一些本地函數和一個將它們公開給C#項目的ref(託管)類。從C++傳遞字符串到C++/CLI

它公開的功能之一返回WCHAR*字符串(又名LPWSTR/wchar_t*)。
當我運行打印它的C#程序時,我只能看到方形符號。

我在原生return語句中設置了一個斷點,調試器顯示返回的字符串是正確的。 然後我跳過一次並降落在託管函數(它有一個WCHAR*變量設置爲返回值),並以某種方式顯示那些方形符號。

似乎一旦字符串進入托管「部分」它會變得混亂。
我會顯示我的代碼,但問題發生之前,我甚至將WCHAR*字符串轉換爲System::String,所以它並不重要。根據要求

代碼示例:

static String^ GetWindowTitle(IntPtr windowHandle) 
{ 
    HWND hWnd = (HWND)windowHandle.ToPointer(); 
    LPWSTR nativeTitle = NativeGetWindowTitle(hWnd).get(); 
    String^ title = gcnew String(nativeTitle); 

    return title; 
} 
+0

請添加代碼示例。 – shfire

+0

@shfire已添加。 – MasterMastic

+1

什麼是NativeGetWindowTitle?你爲什麼在這裏使用C字符串?當然你應該使用'std:wstring'?是什麼讓你相信'nativeTitle'在你將它傳遞給'String'構造函數時仍然有效?似乎很難想象它可能是。 –

回答

3

望着這行:

LPWSTR nativeTitle = NativeGetWindowTitle(hWnd).get(); 

它似乎很清楚,nativeTitle指向的內存擁有者的臨時對象通過NativeGetWindowTitle(hWnd)返回。但是當你通過nativeTitle時,那個臨時已經過去了。

根據C++標準:

臨時對象被銷燬作爲評價全表達式(詞法)包含在其中創建它們的點的最後一步。

假設一切,我們不能看到,工作正常,你可以通過確保對象通過NativeGetWindowTitle(hWnd)生命超越gcnew語句返回解決您的問題。