2014-09-27 16 views
6

У меня есть документация, где записано, что имя пользователя, IP и пароль должны быть const char*, а когда я помещаю varaibles в const char, я получаю это сообщение об ошибке.Невозможно преобразовать 'const char *' в 'WCHAR *' при передаче аргументов

Это мой код:

#include <cstdlib> 
#include <iostream> 
#include <stdio.h> 
#include <windows.h> 

using namespace std; 

typedef int (__cdecl *MYPROC)(LPWSTR); 

int main() 
{ 
    HINSTANCE hinstDLL; 
    MYPROC ProcAdd; 
    hinstDLL = LoadLibrary("LmServerAPI.dll"); 
    if(hinstDLL != NULL){ 
     ProcAdd = (MYPROC) GetProcAddress(hinstDLL,"LmServer_Login");    
     if(ProcAdd != NULL){ 
      const char* IP = "xxx.177.xxx.23"; 
      const char* name = "username"; 
      const char* pass = "password"; 
      int port = 888; 
      ProcAdd(IP,port,name,pass); 
      system ("pause");   
     }   
    } 
} 

И я получил эту ошибку:

cannot convert const char*' to WCHAR*' in argument passing

Какой тип переменной я должен использовать для этих аргументов и как?

+0

Символ '' LPWSTR' ака wchar_t * '? –

+0

Я новичок в C++, не могу преобразовать const char * 'toWCHAR *' в аргумент, передающий это ошибка от dev ++ – DTDest

+1

Есть ли какая-то причина, почему 'ProcAdd' принимает' LPWSTR', если вы поручаете (по вашему вопросу) const char * ', где ни константа, ни совпадение символов не совпадают? – WhozCraig

ответ

11

Вы, скорее всего, с помощью одного из составителей Visual Studio, где в Project Settings, есть Character set выбор. Выбрать из:

  • Unicode набор символов (UTF-16), по умолчанию
  • Multi-Byte набор символов (UTF-8)
  • Не указан

Вызов функции, которые принимают строки в установка Unicode требует, чтобы Unicode строковых литералов:

"hello" 

имеет тип const char*, тогда:

L"hello" 

имеет тип const wchar_t*. Поэтому либо измените свою конфигурацию на Not set, либо измените строковые литералы на широкие.

+0

Я использую dev C++ компилятор, что я должен изменить в этом компиляторе? – DTDest

+0

Это довольно неизвестный компилятор для меня. Где-то может быть такая же настройка. Если вы не можете найти его, просто сделайте литералы Unicode (в строках, где описываются ошибки, которые вы описываете). –

+0

Кроме того, ваш 'MYPROC' ошибочен, у него есть один аргумент, отличный от 'const', но вы передаете четыре константных (порт, ip, пользователь и пароль). Но эта ошибка не связана с вашим вопросом. Правильно будет 'typedef int (__cdecl * MYPROC) (LPCWSTR, int, LPCWSTR, LPCWSTR)'. Но лучше всего обратиться к странице, где описан интерфейс LmServerAPI.dll, поскольку использование другого интерфейса приведет к поломке или неопределенному поведению во время выполнения. –

3

Для литералов, вы хотите использовать L на строке, как в:

L"My String" 

Если вы можете скомпилировать в широком символе или нет, то вы можете рассмотреть вопрос об использовании _T() макроса вместо:

_T("My String") 

Широкоформатные символы под MS-Windows используют формат UTF-16. Для получения дополнительной информации о форматах Unicode смотрите на Unicode website.

Чтобы динамически преобразовать строку, вам необходимо знать формат строки char *. В большинстве случаев под Windows это Win1252, но окончательно не всегда. Microsoft Windows поддерживает множество 8-битных форматов, включая UTF-8 и ISO-8859-1.

Если вы доверяете настройке локали, вы можете использовать функции mbstowc_s().

Для других преобразований, вы можете захотеть взглянуть на MultiByteToWideChar() функции

Смежные вопросы