2

最初に言及しなければならないのは、私は完全なC ++初心者なので、石を投げないでください。ShellExecuteを使用して外部プログラムを強制終了し、ログファイルをできるだけ簡単に削除したいと思います。Linuxではシステムを使用できます(そしてそれは完璧に動作します)が、Windowsでは迷惑なDOSボックスがポップアップします。多くのグーグルの助けを借りて、私はこのコードを書くことができました:

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です。このコードは、短いパスを使用している限り機能します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 ++っぽく、Cishが少なくなります。

ああ、そしてあなたの試みがうまくいかなかった理由に対処するために:動的にサイズ設定された配列(サイズが実行時に決定される配列)は、ヒープに割り当てられている場合にのみ持つことができます。あなたがしなければならないでしょう...

wchar_t* command = new wchar_t[strlen(logFilePath)+50];
//...
delete [] command;
于 2012-06-01T13:01:38.920 に答える