[问题] 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