首先我必须提到,我是绝对的C ++初学者,所以不要扔石头。 我想借助ShellExecute杀死一个外部程序,尽可能简单地删除一个日志文件。 在Linux上,我可以使用系统(它工作完美),但在Windows上一个恼人的dosboxpopup。 随着很多谷歌的帮助,我设法写这个代码:
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。 只要使用短path(例如c:\MyProgram\logfile.txt
此代码就可以工作。 如果日志文件的path较长,例如c:\program files\My Program\anything\more\xxx\...\logfile.txt
则程序崩溃。 我明白,1024是variables的最大长度,但是我怎么告诉C我不知道这个长度?
我试图解决它通过使用strlen(logFilePath)+50
但这只给了我编译错误。 什么是正确的方法?
有很多方法可以做到这一点。 我只是想告诉你我会做什么,而不是给你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;