[問題] CreateFile()回傳INVALID_HANDLE_VALUE
看板C_and_CPP (C/C++)作者xavier13540 (柊 四千)時間1年前 (2023/08/25 15:54)推噓5(5推 0噓 19→)留言24則, 5人參與討論串1/2 (看更多)
開發平台(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 不過我想中文版的應該也會有類似的問題@@
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.240.166.90 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1692950091.A.DCC.html
→
08/25 18:32,
1年前
, 1F
08/25 18:32, 1F
→
08/25 18:35,
1年前
, 2F
08/25 18:35, 2F
你說GetLastError()的回傳值嗎? 是2 查了一下是非常簡單的file not found
→
08/25 21:27,
1年前
, 3F
08/25 21:27, 3F
→
08/25 21:27,
1年前
, 4F
08/25 21:27, 4F
→
08/25 21:28,
1年前
, 5F
08/25 21:28, 5F
改成"Use Multi-Byte Character Set"後總算解決了 謝謝
https://i.imgur.com/K6JFuwZ.png
另外我發現"Not Set"也可以 只有"Use Unicode Character Set"會壞掉
→
08/26 08:51,
1年前
, 6F
08/26 08:51, 6F
→
08/26 08:57,
1年前
, 7F
08/26 08:57, 7F
※ 編輯: xavier13540 (111.240.164.124 臺灣), 08/26/2023 09:17:12
→
08/26 10:41,
1年前
, 8F
08/26 10:41, 8F
我剛剛試了一下 用MBCS就算檔名有日文也可以正常執行
https://i.imgur.com/k0FrApp.png
反倒是用Unicode的話 連a.txt也會壞掉
不過windows似乎建議新的軟體開發都用Unicode 至於MBCS只用來處理legacy code
https://i.imgur.com/xeaw8Dj.png
我覺得還是要想辦法讓我用Unicode編譯後也能成功才是
※ 編輯: xavier13540 (111.240.164.124 臺灣), 08/26/2023 17:25:43
推
08/26 17:27,
1年前
, 9F
08/26 17:27, 9F
→
08/26 17:29,
1年前
, 10F
08/26 17:29, 10F
→
08/26 18:57,
1年前
, 11F
08/26 18:57, 11F
→
08/26 18:58,
1年前
, 12F
08/26 18:58, 12F
推
08/26 19:01,
1年前
, 13F
08/26 19:01, 13F
發現在我的機器上 如果定義了UNICODE和_UNICODE這兩個macro LPTSTR是wchar_t*的別名
// LPTSTR -> LPWSTR -> WCHAR* -> wchar_t*
如果這兩個macro沒有被定義 LPTSTR會變成是char*的別名
// LPTSTR -> LPSTR -> CHAR* -> char*
只要把那兩個macro undefine掉 或者把main改成wmain 執行結果就正常了
書上第二章就有個interlude在介紹unicode 提到了這兩個macro 並引入了_tmain
簡單看了一下後面的example code main()都被替換成_tmain()了
※ 編輯: xavier13540 (111.240.164.124 臺灣), 08/26/2023 20:09:55
推
08/27 03:28,
1年前
, 14F
08/27 03:28, 14F
→
08/27 03:29,
1年前
, 15F
08/27 03:29, 15F
→
08/27 03:29,
1年前
, 16F
08/27 03:29, 16F
→
08/27 03:29,
1年前
, 17F
08/27 03:29, 17F
→
08/27 03:31,
1年前
, 18F
08/27 03:31, 18F
→
08/27 03:32,
1年前
, 19F
08/27 03:32, 19F
→
08/27 03:32,
1年前
, 20F
08/27 03:32, 20F
→
08/27 03:32,
1年前
, 21F
08/27 03:32, 21F
推
08/27 03:43,
1年前
, 22F
08/27 03:43, 22F
推
08/28 14:17,
1年前
, 23F
08/28 14:17, 23F
→
08/28 14:22,
1年前
, 24F
08/28 14:22, 24F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章