2011-11-08 2 views
0

나는 넓은 문자를 멀티 바이트로 변환하려고합니다. yje myfile 부분에만 있습니다. 나머지는 잘 작동합니다. 왜냐하면 저는 여러 곳에서 ofstream을 사용하기 때문에 wofstream을 사용할 수 없기 때문에 이것으로 남았습니다.와이드 문자를 멀티 바이트로

void PrintBrowserInfo(IWebBrowser2 *pBrowser) { 
BSTR bstr; 
pBrowser->get_LocationURL(&bstr); 
std::wstring wsURL; 
wsURL = bstr; 

size_t DSlashLoc = wsURL.find(L"://"); 
if (DSlashLoc != wsURL.npos) 
    { 
    wsURL.erase(wsURL.begin(), wsURL.begin() + DSlashLoc + 3); 
    } 
    DSlashLoc = wsURL.find(L"www."); 
    if (DSlashLoc == 0) 
{ 
wsURL.erase(wsURL.begin(), wsURL.begin() + 4); 
} 
DSlashLoc = wsURL.find(L"/"); 
if (DSlashLoc != wsURL.npos) 
{ 
wsURL.erase(DSlashLoc); 
} 
wprintf(L"\n URL: %s\n\n", wsURL.c_str()); 
char LogURL = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, NULL, 0, NULL, NULL); 
    myfile << "\n URL:" << LogURL; 
    SysFreeString(bstr); 
} 

void EnumExplorers() { 
CoInitialize(NULL); 
SHDocVw::IShellWindowsPtr spSHWinds; 
IDispatchPtr spDisp; 
if (spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK) { 
    long nCount = spSHWinds->GetCount(); 
    for (long i = 0; i < nCount; i++) { 
     _variant_t va(i, VT_I4); 
     spDisp = spSHWinds->Item(va); 
     SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); 
     if (spBrowser != NULL) { 
      PrintBrowserInfo((IWebBrowser2 *)spBrowser.GetInterfacePtr()); 
      spBrowser.Release(); 
     } 
    } 
} else { 
    puts("Shell windows failed to initialise"); 
} 

} 당신이 잘못 WideCharToMultiByte을 사용하고

+0

'LogURL'에 어떤 내용이 나타날 것으로 예상됩니까? 'WideCharToMultiByte'의 리턴 값은 버퍼의 필수 크기입니다. 내 생각에 다른 문서를 읽어야한다. –

+0

'wsURL '이란 무엇입니까? 어쩌면 [이 답변] (http://stackoverflow.com/questions/6587963/c-convert-from-lpctstr-to-const-char/6588525#6588525)이 유용 할 수 있습니다. –

+0

LogURL이 "stackoverflow.com"이라는 URL을 suj로 기대하고 있습니다. 전체 코드는 위의 내용을 참조하십시오. –

답변

3

. 변환 된 문자열을 받으려면 문자열 버퍼를 전달해야합니다. 매개 변수로 NULL0을 사용하면 결과 문자열의 필수 크기가 반환됩니다.

int length = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, NULL, 0, NULL, NULL); 
std::string LogURL(length+1, 0); 
int result = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, &LogURL[0], length+1, NULL, NULL); 

result에 0이 아닌 값이 있는지 확인하여 제대로 작동하는지 확인해야합니다.

+0

고마워요! 이제 정답을 돌려줍니다. 아주 좋은 대답! –

관련 문제