【问题标题】:convert char to LPCWSTR将 char 转换为 LPCWSTR
【发布时间】:2017-06-23 07:07:19
【问题描述】:
char lpszUsername[255];
DWORD dUsername = sizeof(lpszUsername);
GetUserNameA(lpszUsername, &dUsername);
ret_status = NetUserGetInfo(pc_name, lpszUsername, 1, (LPBYTE*)&ui);

所以我需要 GetUserNameA 的字符,但需要 NetUserGetInfo - LPCWSTR。 怎么回事? 如何将 char 转换为这个?

error C2664: 'NetUserGetInfo' : cannot convert parameter 2 from 'char [255]' to 'LPCWSTR'

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    LPCWSTR 翻译成英文为:“Wide-character string”,或 C 中的 wchar_t*。

    要将 ascii 字符串转换为宽字符串,可能需要特殊的转换函数。

    mbstowcs() 可能是你需要的。

    【讨论】:

    • 技术上不是“指向宽字符串的长指针”吗?
    • “指向以零结尾的宽字符序列的远只读指针”。指针本身可以重新分配,但它只能用于读取宽字符,不能更改它们。而且在 Win32 的平面内存模型中,near 指针和 far 指针没有区别。
    【解决方案2】:

    考虑使用GetUserNameW 而不是GetUserNameA。这将为您提供宽字符串中的当前用户名,从而无需从 ANSI 转换为 Unicode。

    WCHAR lpwszUsername[255];
    DWORD dUsername = sizeof(lpwszUsername) / sizeof(WCHAR);
    GetUserNameW(lpwszUsername, &dUsername);
    ret_status = NetUserGetInfo(pc_name, lpwszUsername, 1, (LPBYTE*)&ui);
    

    【讨论】:

    • 更好的是,使用GetUserNameW 避免依赖宏。
    • @dan,但是如果 Loderunner 尝试为 ANSI 编译,这将破坏相反的方式(需要将宽字符串转换为 ANSI 字符串)。依赖宏有什么问题?它是 Windows API 的一个有据可查的部分,并且极不可能更改。
    • @dan,啊,没关系。我错过了 NetUserGetInfo 只有宽字符版本的部分。正在编辑...
    【解决方案3】:

    相关转换宏见MSDN

    #include <AtlBase.h>
    
    USES_CONVERSION;
    
    char lpszUsername[255];
    DWORD dUsername = sizeof(lpszUsername);
    GetUserNameA(lpszUsername, &dUsername);
    
    // A2W() should do it
    ret_status = NetUserGetInfo(pc_name, A2W(lpszUsername), 1, (LPBYTE*)&ui);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2017-03-31
      • 2017-10-14
      相关资源
      最近更新 更多