通过 CreateProcessW 使用“mkdir”创建的目录名称中的垃圾?

Posted

技术标签:

【中文标题】通过 CreateProcessW 使用“mkdir”创建的目录名称中的垃圾?【英文标题】:Junk in directory name created with "mkdir" via CreateProcessW? 【发布时间】:2012-06-08 19:34:48 【问题描述】:

运行以下代码后,一切都按照我的意愿进行,除了文件夹显示:test2﷽﷽ꮫꮫꮫꮫﻮﻮﻮ

这是怎么回事?

            std::string arrString[3] = " /C mkdir C:\\Users\\Andrew\\Desktop\\test1"," /C mkdir C:\\Users\\Andrew\\Desktop\\test2"," /C mkdir C:\\Users\\Andrew\\Desktop\\test3";
            LPWSTR cmd =L"C:\\Windows\\System32\\cmd.exe";
            int i;


            for(i=0; i<3; i++)
            
                STARTUPINFO info=sizeof(info);
                PROCESS_INFORMATION processInfo;
                vector<wchar_t> cmdline(arrString[i].begin(), arrString[i].end());
                CreateProcessW(cmd, &cmdline[0], NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);
                OutputDebugStringW(L"My output\nstring.");
            
        

【问题讨论】:

在所有可能的结果中,这有点漂亮。好吧,除了 4 个盒子。 【参考方案1】:

cmdline 未正确 ASCIIZ 终止。您可以检查这是否是仅添加结尾 0 的原因(注意:未经测试和快速破解):

cmdline.push_back(0);

【讨论】:

CreateProcess 行中正确吗? CreateProcessW(cmd, &amp;cmdline.push_back(0)[0], NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &amp;info, &amp;processInfo); 不,只需将我向您展示的代码放在调用CreateProcessW 的行之前。 完美运行。谢谢你。是否愿意指出我可能确切地向我展示正在发生的方向?文档或我可以查找的关键字。将不胜感激。 这比看起来容易。进入cmdline 的实际字节是文件的正确名称,但是对于CreateProcessW 的调用,字符以0 结尾(字符'\0')是先决条件,所以这就是那一行添加到最后。但是请注意,这是低效的。如果您只是将std::wstring 用于arrString,您可以在对CreateProcessW 的调用中仅使用arrString[i] @Diego :假设您的意思是&amp;arrString[i][0](因为arrString[i] 不会编译,因为std::wstring 没有隐式转换为wchar_t*),这仅在C++ 下是严格合法的11;在 C++03 中,std::string 不需要连续存储其内容。【参考方案2】:

正如其他人所说,您没有将一个以空字符结尾的字符串传递给CreateProcessW(),这就是您最终在文件夹名称中包含额外字符的原因。在单独的说明中,您应该使用CreateDirectoryW() 而不是使用CreateProcessW() 来调用mkdir。然后你可以把arrStringstd::string改成std::wstring,彻底摆脱std::vector

【讨论】:

以上是关于通过 CreateProcessW 使用“mkdir”创建的目录名称中的垃圾?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CreateProcessW() 不执行提供的命令?

使用jna和CreateProcessW时如何获取进程输出

Flutter Web:CreateProcessW 失败 2

通过 FS 寄存器访问衍生进程的 TIB?

windows和Linux程序读取命令输出信息

winApi使用c++创建进程