2

首先我必须提到,我是一个绝对的 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 是字符。只要我使用短路径,此代码就可以工作,例如c:\MyProgram\logfile.txt. 如果日志文件的路径较长,例如c:\program files\My Program\anything\more\xxx\...\logfile.txt程序崩溃。我知道,1024 是变量的最大长度,但是我如何告诉 C 我不知道长度?

我试图通过使用来解决它,strlen(logFilePath)+50但这只会给我编译错误。正确的方法是什么?

4

1 回答 1

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;
于 2012-06-01T13:01:38.920 回答