Wide Char To Multi-Byte - PullRequest
       55

Wide Char To Multi-Byte

0 голосов
/ 09 ноября 2011

Я пытаюсь преобразовать широкий символ в многобайтовый.Это только на части моего файла.Остальное работает нормально. Я не могу использовать wofstream, потому что я использую ofstream в нескольких местах, поэтому я остаюсь с этим.

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");
}

}

1 Ответ

3 голосов
/ 09 ноября 2011

Вы используете WideCharToMultiByte неправильно. Вам нужно передать ему строковый буфер, чтобы получить преобразованную строку. Использование NULL и 0 в качестве параметров, как вы сделали, вернет требуемый размер строки результата.

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 на ненулевое значение, чтобы убедиться, что функция работает правильно.

...