我打電話給一個C++庫,並且正在編寫一個託管的C++包裝類。這些方法接受QString的參數,有時引用QString,以便填寫值。我嘗試過使用std :: string,它似乎很好,直到我編譯它並將它鏈接到c#它就像方法聲明don不存在。所以現在我試圖傳遞System :: String,但我不知道如何將其轉換爲QString。所以這個問題的答案可以用2種形式之一來解決。 1.爲什麼我不能將c#中的方法引用到具有std :: string參數的託管C++代碼中?或者,我如何將System :: String轉換爲QString?System ::字符串到QString
回答
爲什麼我不能將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;
}
性能方面,這比效率遠不如它可能是,但它應該工作,不應該泄漏。
這些不起作用,即使使用正確的包含,編譯器也無法找到PtrToStringChars或Marshal。 – dko 2011-04-13 19:41:50
嗯,我在那裏的一半。我只需要知道這些方法是否會造成內存泄漏以及我能做些什麼
我創建了一些輔助方法來執行此操作。我需要這樣做,從舊的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;
}
是的,那些肯定會造成內存泄漏。爲了解決這個漏洞,把'Marshal :: FreeHGlobal(IntPtr(char));'放在'os = char;'之後。 – ildjarn 2011-06-01 17:20:48
@ildjarn錯誤錯誤C2440: '<函數樣式鑄造>':無法從 '常量爲wchar_t *' 轉換爲 '系統:: IntPtr的' – dko 2011-06-01 20:47:29
啊,對,這是'const'。我將使用我提出的修補程序編輯我的答案,因爲在評論中中繼代碼長於單個表達式是很痛苦的。 :-P – ildjarn 2011-06-01 21:02:49
- 1. QString到字符不工作
- 2. qstring到qchar特殊字符
- 3. 轉換QString時,Local8bit然後轉換字符串的QString
- 4. QByteArray到QBitArray到QbyteArray到QString + Unicode字符
- 5. QString的字符串/文本格式
- 6. 字符串,CString,QString有什麼區別?
- 7. 的QByteArray到的QString到std ::字符串流不起作用
- 8. System ::字符串引用C++ char *參數
- 9. 將system._comobject轉換爲.net字符串
- 10. QString字符擦除功能
- 11. 如何將#defined字符串插入到system()命令中? (win32)中
- 12. 串連STL字符串+ INT + INT + int類型的QString
- 13. 如何用qDebug打印字符串文字和QString?
- 14. 字符串到字符串
- 15. 只有字母字符的QString函數?
- 16. 如何將System字體與Attributed字符串一起使用?
- 17. 字符串到DOM到字符串
- 18. 找到字符串
- 19. 法的QString或std ::字符串超載:調用不明確
- 20. 在QML中包含(regexp)什麼可能是Qstring /字符串
- 21. 如何將C++ QString參數轉換爲C#字符串
- 22. 的Qt的QString從字符串 - 奇怪的信件
- 23. QString :: fromUtf8會自動反轉一個希伯來字符串嗎?
- 24. Qt的轉換UTF-16的十六進制字符串到QString的
- 25. SHGetSpecialFolderPath到系統::字符串^
- 26. 具有特殊字符的QString編碼
- 27. QString :: arg()佔位符後的數字
- 28. 如何將字符轉換爲QString?
- 29. 字符數組到字符串轉換
- 30. 轉換系統:字符串^(C#字符串)到C++的std :: string
你使用的是什麼版本的VC++? – ildjarn 2011-04-13 20:20:01
我正在使用Visual Studio 2005 – dko 2011-04-14 14:04:56