如何将char *转换为LPCWSTR?

时间:2013-10-31 19:35:02

标签: c++ visual-c++ visual-studio-2012

我知道在SO的几个问题中已经讨论过这个问题,但这些解决方案都没有对我有用。

我从char*开始,因为这是针对将从VBA调用的DLL,并且char*是VBA将字符串传递给DLL所必需的。

我需要返回LPCWSTR,因为这是我试图调用的API函数的输入参数,我无法通过在“属性”窗口中从Unicode切换到多字节字符集来启用强制转换,因为API有这段代码:

#if !defined(UNICODE) && !defined(NOUNICODE)
#error UNICODE is not defined. UNICODE must be defined for correct API arguments.
#endif

我试过了:

LPCWSTR convertCharArrayToLPCWSTR(char* charArray)
    {
        const char* cs=charArray;
        wchar_t filename[4096] = {0};
        MultiByteToWideChar(0, 0, cs[1], strlen(cs[1]), filename, strlen(cs[1]));
    }

给出了这些错误:

error C2664: 'strlen' : cannot convert parameter 1 from 'const char' to 'const char *'
error C2664: 'MultiByteToWideChar' : cannot convert parameter 3 from 'const char' to 'LPCCH'

我试过这个(相同的函数头),从this post松散地改编:

size_t retVal;
const char * cs = charArray;    
size_t length=strlen(cs);
wchar_t * buf = new wchar_t[length]();  // value-initialize to 0 (see below)
size_t wn = mbsrtowcs_s(&retVal,buf,20, &cs, length + 1, NULL);
return buf;

编译好了,但是当我传递一个“xyz.xlsx”的示例字符串时,mbsrtowcs_s()buf设置为空字符串:L""

那么,我该如何进行转换?

2 个答案:

答案 0 :(得分:16)

根据Hans Passant关于局部变量指针的建议,我制定了这种方法,这似乎运作良好:

wchar_t *convertCharArrayToLPCWSTR(const char* charArray)
{
    wchar_t* wString=new wchar_t[4096];
    MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
    return wString;
}

我知道使用new需要内存管理,我在调用此函数的函数中执行。

答案 1 :(得分:5)

由于csconst char*cs[1]const char

,C ++不会将它转换为指针,因为在大多数情况下这是没有意义的。

如果意图是跳过第一个字符,您可以改为说&cs[1]cs+1。 (当你将指针传递给第1个元素时,这就是你正在做的事情;在C ++中,索引从0开始。)如果意图是传递整个字符串,那么只需传递cs