2014-10-01 5 views
0

나는 편지를 옮기는 암호 인 SAP의 알 비트 (Al Bhed)로 번역하기를 원하는 사람이 있는지 묻는 프로그램을 가지고있다. 문자열은 잘 변환하지만,이 코드 조각 :.문자열을 말하기 위해 Sapi를 얻는 것

hr = pVoice->Speak(sTranslated, 0, NULL); 

, 그것은 'const를 WCHAR의 *'에서 '표준 : : 문자열'에서 "더 적합한 변환 기능을 말한다 없기 때문에 존재 작동하지 않습니다 는 내가 원하는 건입니다 목소리가 번역 된 문자열을 말할 수 있도록. 어떻게 wchar_t을 입력 사용하는 std::wstringchar을 입력 사용 std::string 내용을, 변환 할 필요가

답변

1

먼저? 나는이 가야합니까. 이것은 사실 그 때문이다 ISpVoice::Speak() 함수는 첫 번째 매개 변수가 LPCWSTR 유형이어야하며 IOW는 "넓은 charac에 대한 const 포인터 ter 문자열 ". 다음 기능이 도움이 될 수 있습니다.

inline std::wstring s2w(const std::string &s, const std::locale &loc = std::locale()) 
{ 
    typedef std::ctype<wchar_t> wchar_facet; 
    std::wstring return_value; 
    if (s.empty()) 
    { 
     return return_value; 
    } 
    if (std::has_facet<wchar_facet>(loc)) 
    { 
     std::vector<wchar_t> to(s.size() + 2, 0); 
     std::vector<wchar_t>::pointer toPtr = &to[0]; 
     const wchar_facet &facet = std::use_facet<wchar_facet>(loc); 
     if (0 != facet.widen(s.c_str(), s.c_str() + s.size(), toPtr)) 
     { 
      return_value = to.data(); 
     } 
    } 
    return return_value; 
} 

그런 다음 코드 줄을 다음과 같이 변경하십시오.

hr = pVoice->Speak(s2w(sTranslated).c_str(), 0, NULL); 

c_str() 방법은에 std::wstring 개체의 "C 문자열 해당"포인터를 반환한다. IOW, null로 끝나는 와이드 문자열에 대한 포인터를 반환합니다.

+0

편집 해 주셔서 감사합니다. Remy Lebeau. 내 대답이 크게 향상되었습니다. –