Конвертировать const wchar_t * в const char * - PullRequest
5 голосов
/ 09 ноября 2011

Я пытаюсь использовать GetHostByName (), для этого требуется const char *. У меня есть мой URL в переменной, которая находится в формате стоимости wchar_t *. Как я могу преобразовать это так, чтобы GetHostByName мог использовать это? Код.

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   Current Website URL: %s\n\n", wsURL.c_str());

    HOSTENT *pHostEnt;
    int  **ppaddr;
    SOCKADDR_IN sockAddr;
    char* addr;
    pHostEnt = gethostbyname(wsURL.c_str());
    ppaddr = (int**)pHostEnt->h_addr_list;
    sockAddr.sin_addr.s_addr = **ppaddr;
    addr = inet_ntoa(sockAddr.sin_addr);
    printf("\n   Current Website IP:%s", addr);

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);
myfile << "\n   Current Website URL:" << LogURL;
myfile << "\n   Current Website IP:"<< addr;

Это ошибка, которую я получаю. IntelliSense: аргумент типа "const wchar_t *" несовместим с параметром типа "const char *"

Ответы [ 4 ]

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

Мне нравится использовать wcstombs (), потому что он довольно прост в использовании.

Попробуйте этот образец:

char *str = new char[4046];
wchar_t array[] = L"Hello World";
wcstombs(str, array, 12);
std::cout << str;

Вот как вы должны конвертировать wchar_t в char *.

EDIT

Изменения в вашем коде:

char* addr = new char[4046];
wcstombs(wsURL, addr, wsURL.size());
pHostEnt = gethostbyname(addr);
1 голос
/ 09 ноября 2011

Это похоже на работу. Комментарии приветствуются.

int Newlength = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, NULL, 0,  NULL, NULL);
std::string NewLogURL(Newlength+1, 0); 
int Newresult = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, &NewLogURL[0],Newlength+1,  NULL, NULL);

    HOSTENT *pHostEnt;
    int  **ppaddr;
    SOCKADDR_IN sockAddr;
    char* addr;

    pHostEnt = gethostbyname(NewLogURL.c_str());
    ppaddr = (int**)pHostEnt->h_addr_list;
    sockAddr.sin_addr.s_addr = **ppaddr;
    addr = inet_ntoa(sockAddr.sin_addr);
    printf("\n   Current Website IP:%s", addr);
0 голосов
/ 22 октября 2013
    /***** This code is well done *****/

    #include...
    #include...

    int wmain(int argc, wchar_t *argv[])
    {
         ...
         ...
         char *path = new char[255];
         wcstombs(path, argv[2], 255);
         IplImage *img; 
   if (img = cvLoadImage (path, 1))
         {
             Mat input_img = Mat (img);
             imshow ("haha",input_img);
             waitKey(0);
         }
         ...
         ...
         //wcout<<endl<<argv[2];
    }
0 голосов
/ 09 ноября 2011

WideCharToMultiByte - это вызов Win32 API, который делает это в конце дня, хотя в зависимости от того, какие платформы вы используете (MFC, WTL и т. Д.), Может быть лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...