通过 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, &cmdline.push_back(0)[0], NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &info, &processInfo);
不,只需将我向您展示的代码放在调用CreateProcessW
的行之前。
完美运行。谢谢你。是否愿意指出我可能确切地向我展示正在发生的方向?文档或我可以查找的关键字。将不胜感激。
这比看起来容易。进入cmdline
的实际字节是文件的正确名称,但是对于CreateProcessW
的调用,字符以0 结尾(字符'\0'
)是先决条件,所以这就是那一行添加到最后。但是请注意,这是低效的。如果您只是将std::wstring
用于arrString
,您可以在对CreateProcessW
的调用中仅使用arrString[i]
。
@Diego :假设您的意思是&arrString[i][0]
(因为arrString[i]
不会编译,因为std::wstring
没有隐式转换为wchar_t*
),这仅在C++ 下是严格合法的11;在 C++03 中,std::string
不需要连续存储其内容。【参考方案2】:
正如其他人所说,您没有将一个以空字符结尾的字符串传递给CreateProcessW()
,这就是您最终在文件夹名称中包含额外字符的原因。在单独的说明中,您应该使用CreateDirectoryW()
而不是使用CreateProcessW()
来调用mkdir
。然后你可以把arrString
从std::string
改成std::wstring
,彻底摆脱std::vector
。
【讨论】:
以上是关于通过 CreateProcessW 使用“mkdir”创建的目录名称中的垃圾?的主要内容,如果未能解决你的问题,请参考以下文章