天天看點

C++ struct結構體定義構造函數和析構函數,構造函數參數從VS2017平台轉換到Qt5平台下建構出錯,采用字元集轉換函數将string類型轉換為wstring,建構仍然出錯!

調試win硬體驅動,需要利用VS編譯的win驅動建構自己的Qt5GUI程式:

其中部分win驅動源碼如下

device_file::device_file(const std::string& path, DWORD accessFlags) {

h = CreateFile(path.c_str(), accessFlags, 0, NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, NULL);

}

調用winAPI CreateFile函數在win中字元編碼是兩個位元組,但在Qt5中UTF_8是一個位元組,建構出錯,錯誤資訊如下:

error: C2664:

“HANDLE CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE)”:

無法将參數 1 從“const _Elem *”轉換為“LPCWSTR”

with [ _Elem=char]

與指向的類型無關;強制轉換要求 reinterpret_cast、C 樣式強制轉換或函數樣式強制轉換。

采用方法參考:https://www.cnblogs.com/lxt287994374/archive/2013/06/13/3133389.html

将第一個參數采用調用函數方法轉換為wstring類型,建構結果出錯,錯誤資訊:

error: C2664: “std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string(const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &)”: 無法将參數 1 從“WCHAR [1]”轉換為“std::initializer_list<_Elem>”with[_Elem=char]

2019年3月19日

2019年3月20 日

尋找朋友幫助後發現是源碼問題,一是容器,而是編譯環境;

1 容器方面--錯誤原因:構造空的vector時是不調用對象的構造函數

std::vector<std::string> device_paths;

//

// for (unsigned index = 0;

// SetupDiEnumDeviceInterfaces(device_info, NULL, &guid, index, &device_interface);

2 編譯環境--錯誤原因:

VS2017編譯win驅動,Qt調用win驅動會出點問題。

--------------------------------------------------------------------------------------------------------------

将多位元組寬字元問題在VS上解決後,Qt5建構出錯:

LNK2005:main已經在main.obj中定義:未找到檔案:xdma_test.obj

LNK1169:找不到一個或多個重定義的符号

這裡待解決。。。。繼續更新。。。。

技術提升的道路永無止境在Qt中

針對LNK2005:main已經在main.obj中定義:未找到檔案:xdma_test.obj問題,LNK1169:找不到一個或多個重定義的符号。

在Qt5中查找main發現mainwindow.h和xxxx.cpp均有main定義更換xxxx.cpp中的main名稱即可通過編譯。

---------------------------------------------------------------------------------------------------------------