2014-09-27 19 views
6

Ho una documentazione dove scritto che nome utente, IP e password devono essere const char* e quando inserisco articoli in const char, ricevo questo messaggio di errore.Impossibile convertire 'const char *' in 'WCHAR *' nell'argomento che passa

Questo è il mio codice:

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

ed ho ottenuto questo errore:

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

Che tipo di variabile devo usare per questi argomenti e come?

+0

Un 'LPWSTR' alias' wchar_t * '? –

+0

Sono nuovo in C++, non posso convertire const char * 'in WCHAR *' nell'argomento passando questo è errore da dev ++ – DTDest

+1

C'è qualche ragione per cui 'ProcAdd' prende un' LPWSTR' se stai richiedendo (per la tua domanda) un ' const char * ', dove né la costanza, né la larghezza del carattere corrispondono? – WhozCraig

risposta

11

Probabilmente si sta utilizzando uno dei compilatori di Visual Studio, dove nel Project Settings, v'è una scelta Character set. Scegliere da:

  • set di caratteri Unicode
  • Multi-Byte set di caratteri (UTF-16), di default (UTF-8)
  • Not Set

funzioni che accettano le stringhe nel Calling impostazione Unicode richiede di fare Unicode stringhe letterali:

"hello" 

è di tipo const char*, considerando quanto segue:

L"hello" 

è di tipo const wchar_t*. Quindi, cambia la configurazione in Not set o cambia i valori letterali delle stringhe in quelli di larghezza.

+0

sto usando il compilatore C++ Dev quello che devo cambiare in questo compilatore? – DTDest

+0

Questo è un compilatore piuttosto sconosciuto per me. Potrebbe esserci un'impostazione simile da qualche parte. Se non riesci a trovarlo, crea semplicemente il letterale Unicode (nelle righe in cui si verificano gli errori che descrivi). –

+0

Inoltre, il tuo 'MYPROC' è imperfetto, ha un argomento non-'const' ma stai passando quattro const (port, ip, user e password). Ma questo bug non è correlato alla tua domanda. Corretto sarebbe 'typedef int (__cdecl * MYPROC) (LPCWSTR, int, LPCWSTR, LPCWSTR)'. Ma è meglio fare riferimento alla pagina in cui è descritta l'interfaccia di 'LmServerAPI.dll', in quanto l'utilizzo di un'interfaccia diversa provocherà un arresto anomalo o un comportamento indefinito in fase di runtime. –

3

Per letterali, si desidera utilizzare L sulla corda come in:

L"My String" 

Se si può compilare in carattere largo o no, allora si può prendere in considerazione utilizzando la macro _T() invece:

_T("My String") 

I caratteri di stringa ampia in MS-Windows utilizzano il formato UTF-16. Per ulteriori informazioni sui formati Unicode, guarda su Unicode website.

Per convertire dinamicamente una stringa, è necessario conoscere il formato della stringa char *. Nella maggior parte dei casi, sotto Windows è un Win1252, ma in definitiva non sempre. Microsoft Windows supporta molti formati a 8 bit, inclusi UTF-8 e ISO-8859-1.

Se si considera attendibile l'impostazione locale, è possibile utilizzare le funzioni mbstowc_s().

Per le altre conversioni, si consiglia di guardare il MultiByteToWideChar() funzione di

Problemi correlati