調試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名稱即可通過編譯。
---------------------------------------------------------------------------------------------------------------