2016-09-08 5 views
-3

에서 ShellExecute 기능에 대한 몇 가지 문제가 예상되는 결과가 ToolUpdater.exe -i Hackeroid_Qqhcs을 실행하는 것입니다나는이 같은 명령을 호출 할

std::string szArg = " -i " + m_strSign; 
wstringstream wss; 
wss<<szArg.c_str(); 
wstringstream wssa; 
wssa<<strToolupdater.c_str(); 
ShellExecute(NULL,TEXT("open"), wssa.str().c_str(), wss.str().c_str(),TEXT(""),SW_NORMAL); 
wcout<<wssa.str().c_str()<<wss.str().c_str()<<endl; 

을하지만, 실제 결과가 ToolUpdater.exe이고, 입력 매개 변수가 유효하지 않습니다.

+0

을 그리고 예상되는 결과는 무엇인가 : 예는 필요할 때? BTW는 코드 사진을 게시하지 않지만 코드를 게시합니다. –

+0

예상 결과는 ToolUpdater.exe -i Hackeroid_Qqhcs입니다. 실제로 실제 결과는 ToolUpdater.exe입니다. 매개 변수가 유효하지 않습니다. – bai

+0

귀하의 질문을 업데이트하십시오, 여기 서 있기 때문에 완전히 명확하지 않습니다. –

답변

1

문제는 사용자가 std::stringstd::wstring 데이터를 함께 혼합하여 잘못 처리하고 있다는 것입니다.

std::wstringstream

operator<< 입력 char* 위해이없는, 그래서 당신은 실제로 대신 operator<<에 대한 void* 입력을 호출한다. 이 연산자는 포인터를 가리키는 데이터가 아니라 포인터 자체의 값을 형식화합니다. 따라서 나쁜 입력을 ToolUpdater.exe으로 전달하게됩니다.

c_str()을 너무 많이 사용하지 않았다면 컴파일 타임에이 오류를 발견했을 것입니다. 실제로 문자가 아닌 포인터 (예 : ShellExecute() 매개 변수)가 아니면 c_str()을 사용하지 마십시오. 당신은 원시 포인터를 피하기 경우, 컴파일러는 당신을 위해 더 나은 유형의 안전 검증을 수행 할 수 있습니다

말했다되고 그건
std::string szArg = " -i " + m_strSign; 
std::wstringstream wss; 
wss << szArg; // ERROR! 
std::wstringstream wssa; 
wssa << strToolupdater; // ERROR! 
ShellExecute(NULL, TEXT("open"), wssa.str().c_str(), wss.str().c_str(), TEXT(""), SW_NORMAL); 
std::wcout << wssa.str() << wss.str() << std::endl; 

, 당신은 정말, 당신이 완전히 제거 할 수 있습니다이 예에서 std::wstringstream 객체가 필요하지 않습니다. 당신이 std::wstring에 이르기까지 모든 변경하는 경우,

std::string szArg = "-i " + m_strSign; 
ShellExecuteA(NULL, "open", strToolupdater.c_str(), szArg.c_str(), NULL, SW_NORMAL); 
std::cout << strToolupdater << " " << szArg << std::endl; 

을 또는 :

std::wstring szArg = L"-i " + m_strSign; 
ShellExecuteW(NULL, L"open", strToolupdater.c_str(), szArg.c_str(), NULL, SW_NORMAL); 
std::wcout << strToolupdater << L" " << szArg << std::endl; 

을 당신이 당신의 m_strSign를 변경할 수없는 경우 대신 ShellExecuteA()를 호출하는 경우

, 당신은 이런 식으로 std::string 값을 전달할 수 있습니다 그리고 strToolupdater 변수 자체는 std::wstring (다른 코드는 여전히 std::string을 예상하므로)을 std::wstring temporaril

std::wstring toWStr(const std::string &s) 
{ 
    std::wstring ret; 
    int len = MultiByteToWideChar(0, 0, s.c_str(), s.length(), NULL, 0); 
    if (len > 0) 
    { 
     ret.resize(len); 
     MultiByteToWideChar(0, 0, s.c_str(), s.length(), &ret[0], len); 
    } 
    return ret; 
} 

std::wstring szToolUpdater = toWStr(strToolupdater); 
std::wstring szArg = L"-i " + toWStr(m_strSign); 
ShellExecuteW(NULL, L"open", szToolUpdater.c_str(), szArg.c_str(), NULL, SW_NORMAL); 
std::wcout << szToolUpdater << L" " << szArg << std::endl;