【问题标题】:Cannot convert 'const char*' to 'WCHAR*' in argument passing无法在参数传递中将 'const char*' 转换为 'WCHAR*'
【发布时间】:2014-11-22 07:20:59
【问题描述】:

我的文档中写明用户名、IP 和密码必须为 const char*,当我将变量放入 const char 时,我收到了此错误消息。

这是我的代码:

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

我得到了这个错误:

无法在参数传递中转换const char*' toWCHAR*'

我必须为这些参数使用哪种变量以及如何使用?

【问题讨论】:

  • 一个LPWSTR又名wchar_t *?
  • 我是 C++ 新手,无法在参数中将 const char*' 转换为 WCHAR*',这是来自 dev++ 的错误
  • 如果您要求(根据您的问题)const char*,那么 ProcAdd 是否有某种原因需要 LPWSTR,其中 const-ness 和字符宽度都不匹配?

标签: c++ char wchar


【解决方案1】:

对于文字,您想在字符串上使用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() 函数

【讨论】:

    【解决方案2】:

    您很可能使用其中一种 Visual Studio 编译器,在 Project Settings 中,有一个 Character set 选项。选择:

    • Unicode 字符集 (UTF-16),默认
    • 多字节字符集 (UTF-8)
    • 未设置

    在 Unicode 设置中调用接受字符串的函数需要您制作 Unicode 字符串文字:

    "hello"
    

    类型为const char*,而:

    L"hello"
    

    类型为const wchar_t*。因此,要么将您的配置更改为Not set,要么将您的字符串文字更改为宽字符。

    【讨论】:

    • 我正在使用开发 C++ 编译器,我必须在此编译器中进行哪些更改?
    • 这对我来说是一个非常陌生的编译器。某处可能有类似的设置。如果找不到,只需将文字设为 Unicode(在您描述的错误发生的行处)。
    • 另外,您的MYPROC 有缺陷,它有一个非const 参数,但您传递了四个常量(端口、IP、用户和密码)。但是该错误与您的问题无关。正确的是typedef int (__cdecl *MYPROC)(LPCWSTR, int, LPCWSTR, LPCWSTR)。但您最好参考描述LmServerAPI.dll 接口的页面,因为使用不同的接口会导致运行时崩溃或未定义的行为。
    • 如果 UTF-8 得到 MS 的支持就好了。
    • 对于那些在 Visual Studio 2017 中寻找这个的人,它位于项目属性 > 配置 > 常规选项卡 > 项目默认值 > 字符集下。
    猜你喜欢
    • 2012-01-28
    • 2020-09-08
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多