2011-04-13 39 views
1

我打電話給一個C++庫,並且正在編寫一個託管的C++包裝類。這些方法接受QString的參數,有時引用QString,以便填寫值。我嘗試過使用std :: string,它似乎很好,直到我編譯它並將它鏈接到c#它就像方法聲明don不存在。所以現在我試圖傳遞System :: String,但我不知道如何將其轉換爲QString。所以這個問題的答案可以用2種形式之一來解決。 1.爲什麼我不能將c#中的方法引用到具有std :: string參數的託管C++代碼中?或者,我如何將System :: String轉換爲QString?System ::字符串到QString

+0

你使用的是什麼版本的VC++? – ildjarn 2011-04-13 20:20:01

+0

我正在使用Visual Studio 2005 – dko 2011-04-14 14:04:56

回答

3

爲什麼我不能將c#中的方法引用到具有std :: string參數的託管C++代碼中?

只有POD類型可以在本機代碼和託管代碼之間來回自動編組。 std::string不是POD類型。

或者,如何將System :: String轉換爲QString?

#include <string> 
#include <QString> 
#include <msclr/marshal_cppstd.h> 

QString SystemStringToQString(System::String^ str) 
{ 
    using namespace msclr::interop; 
    return QString::fromStdWString(marshal_as<std::wstring>(str)); 
} 

編輯(響應的答案#6205169評論):

建議內存泄漏修復:

std::wstring MarshalString(String^ s) 
{ 
    using namespace System::Runtime::InteropServices; 
    std::wstring ret; 
    IntPtr p = Marshal::StringToHGlobalUni(s); 
    if (p.ToPointer()) 
    { 
     ret.assign((wchar_t const*)p.ToPointer()); 
     Marshal::FreeHGlobal(p); 
    } 
    return ret; 
} 

性能方面,這比效率遠不如它可能是,但它應該工作,不應該泄漏。

+0

'msclr':不是類或名稱空間名稱 – dko 2011-04-13 21:12:38

+0

@dko:那麼你要麼是VC++的版本太舊,要麼你沒有'#include '。你使用的是什麼版本的VC++? – ildjarn 2011-04-13 21:34:30

+0

@dko:作爲一個完整性檢查,您*從C++/CLI嘗試這樣做,而不是C#或C++,對吧? – ildjarn 2011-04-13 22:17:03

0

嗯,我在那裏的一半。我只需要知道這些方法是否會造成內存泄漏以及我能做些什麼

我創建了一些輔助方法來執行此操作。我需要這樣做,從舊的Qt庫轉移到CLI字符串。我無法更新Qt庫,因爲我無法控制那部分代碼。

void MarshalString ( String^s, wstring& os) { 
    using namespace Runtime::InteropServices; 
    const wchar_t* char = 
     (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer(); 
    os = char; 
} 
QString SystemStringToQt(System::String^ str) 
{ 
    wstring t; 
    MarshalString(str, t); 
    QString r = QString::fromUcs2((const ushort*)t.c_str()); 
    return r; 
} 
String^QtToSystemString(QString * str) 
{ 

    wchar_t * wcar = (wchar_t *)str->ucs2(); 
    String^ r = gcnew String(wcar); 
    return r; 
} 
+0

是的,那些肯定會造成內存泄漏。爲了解決這個漏洞,把'Marshal :: FreeHGlobal(IntPtr(char));'放在'os = char;'之後。 – ildjarn 2011-06-01 17:20:48

+0

@ildjarn錯誤錯誤C2440: '<函數樣式鑄造>':無法從 '常量爲wchar_t *' 轉換爲 '系統:: IntPtr的' – dko 2011-06-01 20:47:29

+0

啊,對,這是'const'。我將使用我提出的修補程序編輯我的答案,因爲在評論中中繼代碼長於單個表達式是很痛苦的。 :-P – ildjarn 2011-06-01 21:02:49

相關問題