문제는 사용자가 std::string
과 std::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;
을 그리고 예상되는 결과는 무엇인가 : 예는 필요할 때? BTW는 코드 사진을 게시하지 않지만 코드를 게시합니다. –
예상 결과는 ToolUpdater.exe -i Hackeroid_Qqhcs입니다. 실제로 실제 결과는 ToolUpdater.exe입니다. 매개 변수가 유효하지 않습니다. – bai
귀하의 질문을 업데이트하십시오, 여기 서 있기 때문에 완전히 명확하지 않습니다. –