[問題] CreateFile()回傳INVALID_HANDLE_VALUE

作者: xavier13540 (柊 四千)   2023-08-25 15:54:42
開發平台(Platform): (Ex: Win10, Linux, ...)
Win11
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
我最近在用Johnson M. Hart的書學windows的系統程式設計
書上給出了這份使用CreateFile()的程式碼 簡單實作linux上的cp指令
https://ideone.com/P9q9SD
我用vs2022新增c++ project 加入這份code 按ctrl+F5編譯後 總是找不到名稱同argv[1]的
檔案
https://i.imgur.com/0255HCz.png
我做了兩個實驗
1.
在這份code裡面加入幾行得到
https://ideone.com/7muAkc
預期這份新的code會先寫一些東西進argv[2]
但重新ctrl+F5後 會發現argv[2]本身變成亂碼
https://i.imgur.com/9EUnaHa.png
2.
不用ctrl+F5而是直接用cl.exe編譯 結果一切符合預期
https://i.imgur.com/PgLEPRF.png
請問可能的原因是什麼?
我用的是日文版的windows 11 不過我想中文版的應該也會有類似的問題@@
作者: nh60211as   2023-08-25 18:32:00
你有看是什麼錯誤嗎?https://i.imgur.com/0S9yH6l.png更正,錯誤碼是什麼
作者: L4ys (Lays)   2023-08-25 21:27:00
Visual Studio project default 會使用 Unicode 版本的Windows API, 所以其實呼叫的是 CreateFileW, 專案設定裡面可以修改
作者: stupid0319 (徵女友)   2023-08-26 08:51:00
輸入是utf-8,應該轉成utf-32餵給windowsa.txt的utf-32會變兩倍大
作者: L4ys (Lays)   2023-08-26 18:57:00
main的argv都是char**,不該用LPTSTR,正確做法是改用wmain或是呼叫GetCommandLine/CommandLineToArgv或是用_tmain配合LPTSTR argv[]
作者: LPH66 (-6.2598534e+18f)   2023-08-27 03:28:00
MSVC 裡一部份帶 _t 的字串"函數"就是為了這個設定加的(這些會在 <tchar.h> 裡) 當有定義 UNICODE 時它處理寬字元當沒有定義時它是處理 char 字串當有定義 MBCS 時它會變成 _mb 開頭的字串處理函數主要是用在同一支原始碼分別編出 char 字串跟 wchar_t 字串(以及如果要的話 MBCS 字串) 不同版本時在用的那 main 本身有個字串(陣列)參數, 所以也會有 _t 版本(這就是上面提的 _tmain 的由來)啊對對, LP"T"STR 的這個 T 也是 <tchar.h> 這個 t 的意思
作者: lwecloud (CloudEX)   2023-08-28 14:17:00
2023了,不是歷史共業的話,直接用UNICODE吧你用MBCS是因為你日文系統,餵一個中文檔名就掛了

Links booklink

Contact Us: admin [ a t ] ucptt.com