2014-09-27 11 views
6

Ich habe Dokumentation wo geschrieben, dass Benutzername, IP und Passwort const char* sein müssen und wenn ich Varaibles in const char setze, bekomme ich diese Fehlermeldung.Kann 'const Char *' nicht in 'WCHAR *' in Argument übergeben

Dies ist mein Code:

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

Und ich habe diesen Fehler:

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

Welche Art von Variable muss ich für diese Argumente verwenden und wie?

+0

A 'LPWSTR' aka' wchar_t * 'aussehen soll? –

+0

Ich bin neu in C++, const char * 'toWCHAR *' kann nicht konvertiert werden, wenn dieses Argument übergeben wird, ist ein Fehler von dev ++ – DTDest

+1

Gibt es einen Grund, 'ProcAdd' einen' LPWSTR' zu nehmen, wenn du (per deiner Frage) ein ''mandierst const char * ', wobei weder die const-ness noch die character width übereinstimmen? – WhozCraig

Antwort

11

Sie sind höchstwahrscheinlich eine der Visual Studio-Compiler verwenden, wo in Project Settings, ist eine dort Character set Wahl. Wählen Sie aus:

  • Unicode-Zeichensatz (UTF-16), das Standard
  • Multi-Byte-Zeichensatz (UTF-8)
  • Nicht gesetzt

Funktionen aufrufen, die Strings in der nehmen Unicode-Einstellung erfordert, dass Sie Unicode-Zeichenketten zu machen:

"hello" 

ist vom Typ const char*, während:

L"hello" 

ist vom Typ const wchar_t*. Ändern Sie also entweder Ihre Konfiguration in Not set oder ändern Sie Ihre String-Literale in Wide-Zeichen.

+0

ich benutze dev C++ Compiler, was ich in diesem Compiler ändern muss? – DTDest

+0

Das ist ein ziemlich unbekannter Compiler für mich. Es könnte irgendwo eine ähnliche Einstellung geben. Wenn Sie es nicht finden können, machen Sie einfach die Literale Unicode (in Zeilen, wo die Fehler auftreten, die Sie beschreiben). –

+0

Auch Ihr 'MYPROC' ist fehlerhaft, es hat ein Nicht-' const'-Argument, aber Sie übergeben vier Konstanten (Port, IP, Benutzer und Passwort). Aber dieser Bug hat nichts mit Ihrer Frage zu tun. Richtig wäre 'typedef int (__cdecl * MYPROC) (LPCWSTR, int, LPCWSTR, LPCWSTR)'. Am besten verweisen Sie jedoch auf die Seite, auf der die Schnittstelle von 'LmServerAPI.dll' beschrieben wird, da die Verwendung einer anderen Schnittstelle zur Laufzeit zu Absturz oder undefiniertem Verhalten führt. –

3

Für Literale, möchten Sie L auf die Zeichenfolge verwenden, wie in:

L"My String" 

Wenn Sie in weiten Charakter oder nicht kompilieren können, dann sollten Sie mit dem _T() Makro stattdessen berücksichtigen:

_T("My String") 

Breite Zeichenfolge Zeichen unter MS-Windows verwenden das UTF-16-Format. Weitere Informationen zu Unicode-Formaten finden Sie unter Unicode website.

Um eine Zeichenfolge dynamisch zu konvertieren, müssen Sie das Format Ihrer char *-Zeichenfolge kennen. In den meisten Fällen ist es unter Windows ein Win1252, aber definitiv nicht immer. Microsoft Windows unterstützt viele 8-Bit-Formate, einschließlich UTF-8 und ISO-8859-1.

Wenn Sie der Gebietsschemaeinstellung vertrauen, können Sie die mbstowc_s() Funktionen verwenden.

Für andere Umwandlungen, können Sie an der MultiByteToWideChar() Funktion

Verwandte Themen