2012-06-01 7 views
2

먼저 C++ 초보자이므로 돌을 던지지 마십시오. ShellExecute를 사용하여 외부 프로그램을 종료하고 가능한 한 간단하게 로그 파일을 삭제하려고합니다. 리눅스에서는 필자가 시스템을 사용할 수 있지만 (완벽하게 작동합니다), 창문에서는 짜증나는 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가 문자입니다 : 구글의 많은 도움으로이 코드를 작성하는 관리. 이 코드는 짧은 경로 e를 사용하는 한 작동합니다. 지. c:\MyProgram\logfile.txt. 로그 파일 경로가 더 긴 경우 e. 지. 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); 

이 방법 ++ 분에 덜 CISH 좀 더 C입니다.

아, 시도가 실패한 이유를 설명하십시오. 힙에 할당 된 동적 크기의 배열 (런타임에 크기가 결정되는 배열) 만 가질 수 있습니다. 당신은해야 할 것입니다 ...

wchar_t* command = new wchar_t[strlen(logFilePath)+50]; 
//... 
delete [] command; 
+2

두 번째 솔루션을 사용했습니다. 제 생각에, 나는 C++ ish magic으로 가기 전에 cish stuff으로 시작할 것입니다. 고맙습니다! – Oliver

관련 문제