12

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

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

我需要返回 aLPCWSTR因为这是我尝试调用的 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'

我尝试了这个(相同的函数头),大致改编自这篇文章

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""

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

4

2 回答 2

20

按照 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需要内存管理,我在调用它的函数中执行。

于 2013-10-31T22:50:39.853 回答
4

既然cs是一个const char*cs[1]就是一个const char。C++ 不会为您将其转换为指针,因为在大多数情况下这没有意义。

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

于 2013-10-31T19:42:39.933 回答