首先我要提一下,我是一个绝对的C ++初学者,所以不要扔石头。我想在ShellExecute的帮助下杀死外部程序并尽可能简单地删除日志文件。在Linux上,我可以使用系统(它工作得很完美),但在Windows上弹出一个恼人的dosbox。在很多谷歌的帮助下,我设法编写了这段代码:
wchar_t command[1024] = L"b";
swprintf_s(command, _countof(command), L"/C TASKKILL /IM ExternalProgram.exe /F & del \"%S\"", logFilePath);
ShellExecute( NULL, L"open", L"cmd.exe", command, NULL, SW_HIDE );
logFilePath是char。只要我使用短路径e,此代码就可以工作。 G。 c:\MyProgram\logfile.txt
。如果日志文件的路径较长e。 G。 c:\program files\My Program\anything\more\xxx\...\logfile.txt
程序崩溃了。我明白,1024是变量的最大长度,但我怎么告诉C我不知道长度?
我尝试使用strlen(logFilePath)+50
绕过它,但这只给了我编译错误。什么是正确的方法?
答案 0 :(得分:4)
有很多方法可以做到这一点。而不是给你15个选项,我只是告诉你我会做什么:
#include <sstream>
std::wstringstream strStream;
strStream << L"/C TASKKILL /IM ExternalProgram.exe /F & del \"" << logFilePath << L"\"";
std::wstring command = strStream.str();
ShellExecute( NULL, L"open", L"cmd.exe", command.c_str(), NULL, SW_HIDE );
这种方式多一点C ++ ish而不是Cish。
哦,并解决为什么你的尝试不起作用:如果它们在堆中分配,你只能拥有动态大小的数组(大小在运行时确定的数组)。你必须这样做......
wchar_t* command = new wchar_t[strlen(logFilePath)+50];
//...
delete [] command;