2012-06-01 125 views
2

首先我必須提到,我是絕對的C++初學者,所以不要扔任何石頭。我想借助ShellExecute殺死一個外部程序並儘可能簡單地刪除一個日誌文件。在Linux上我可以使用系統(並且它工作的很好),但是在Windows上一個令人討厭的dosbox彈出。在很多谷歌的幫助下,我設法寫下如下代碼:初始化動態長度的wchar_t

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來解決它,但這隻給我編譯錯誤。什麼是正確的方法?

回答

3

有很多方法可以做到這一點。而不是給你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; 
+2

我用你的第二個解決方案。我想,在開始使用C++ ish魔法之前,我會先從cish的東西開始。謝謝! – Oliver