導航 1.編譯環境 2.項目配置 1.設置附加包含目錄 2.設置附加庫目錄 3.設置附加依賴項 3.CLR中各種定義 1.介面定義 2.類定義 3.枚舉定義 4.屬性定義 4.CLR中各種使用 1.類的實例化 2.命名空間的使用 5.CLR中數據類型的轉換 1.String ^ 到 QString ...
導航
1.編譯環境
系統:windows10
環境:VS2010 + Qt5.5.1
2.項目配置
1.設置附加包含目錄
1.此項設置包含的頭文件,需要填入用到的.h文件目錄
2.下圖中的QTDIR是Qt5.5.1安裝目錄環境變數(預設路徑:C:\Qt\Qt5.5.1\5.5\msvc2010)
2.設置附加庫目錄
1.此項設置引用的lib目錄,如下圖。
3.設置附加依賴項
1.此處設置指定的lib文件,一般不用填寫。
3.CLR中各種定義
1.介面定義
2.類定義
3.枚舉定義
4.屬性定義
1.介面中定義:
2.類中定義:
4.CLR中各種使用
1.類的實例化
所有.net對象都需要使用gcnew進行創建,gcnew創建的對象不需要自己手動釋放記憶體。
GTable ^ ret = gcnew GTable();
2.命名空間的使用
命名空間用於限定類,不同於C#,這裡使用::進行分割。
virtual MyNameSpace::ITable ^ GetTable(int index);
5.CLR中數據類型的轉換
1.String ^ 到 QString 的轉換
QString MarshalString(String ^ s) { using namespace Runtime::InteropServices; const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); string str = chars; QString ret = str.c_str(); Marshal::FreeHGlobal(IntPtr((void*)chars)); return ret; }
2.QString 到 String ^ 的轉換
String ^ MarshalStringLocal8(QString os) { using namespace Runtime::InteropServices; if (os.isNull()) return nullptr; QByteArray data = os.toLocal8Bit(); char * str = new char[data.length() + 1]; strcpy_s(str, data.length() + 1, data.constData()); String ^ ret = Marshal::PtrToStringAnsi(static_cast<IntPtr>(str)); delete str; return ret; }
String ^ MarshalString(QString os) { using namespace Runtime::InteropServices; QByteArray data = os.toUtf8(); char * str = new char[data.length() + 1]; strcpy_s(str, data.length() + 1, data.constData()); String ^ ret = Marshal::PtrToStringAnsi(static_cast<IntPtr>(str)); delete str; return ret; }
3.char * 到 String ^
String ^ MarshalString(char* os) { using namespace Runtime::InteropServices; String ^ ret = Marshal::PtrToStringAnsi(static_cast<IntPtr>(os)); return ret; }
4.wchar_t * 到 String ^
String ^ MarshalString(wchar_t* os) { using namespace Runtime::InteropServices; String ^ ret = Marshal::PtrToStringUni((IntPtr)os); return ret; }
5.數組的轉換
using namespace System::Runtime::InteropServices; QByteArray byteArray = obj.toByteArray(); int length = byteArray.count(); array<Byte> ^ rbyteArray = gcnew array<Byte>(length + 2); Marshal::Copy((IntPtr)byteArray.data(), rbyteArray, 0, length); ret = rbyteArray;