Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 如何将PUNICODE_字符串转换为bstr?_Visual C++_String_Com Interop - Fatal编程技术网

Visual c++ 如何将PUNICODE_字符串转换为bstr?

Visual c++ 如何将PUNICODE_字符串转换为bstr?,visual-c++,string,com-interop,Visual C++,String,Com Interop,我正在从VC++代码调用一个位于ComVisible托管dll中的函数。在托管dll中,函数参数类型为字符串 在VC++代码中,我将变量设置为PUNICODE\u字符串。如何将其传递给函数?如何将其转换为BSTR 多谢各位 NLV首先要注意的是,PUNICODE_字符串的内部字符串缓冲区可能不是以null结尾的。所以最好通过一个标准的以null结尾的宽字符串,然后可以直接传递给SysAllocString 试试这个: BSTR PUNICODEToBSTR(PUNICODE_STRING pSt

我正在从VC++代码调用一个位于ComVisible托管dll中的函数。在托管dll中,函数参数类型为字符串

在VC++代码中,我将变量设置为PUNICODE\u字符串。如何将其传递给函数?如何将其转换为BSTR

多谢各位


NLV

首先要注意的是,PUNICODE_字符串的内部字符串缓冲区可能不是以null结尾的。所以最好通过一个标准的以null结尾的宽字符串,然后可以直接传递给SysAllocString

试试这个:

BSTR PUNICODEToBSTR(PUNICODE_STRING pStr)
{
    // create a null-terminated version of the input string
    wchar_t* nullTerminatedString = new wchar_t[pStr->Length + 1];
    memset(nullTerminatedString, 0, sizeof(wchar_t) * (pStr->Length + 1)];
    wcsncpy(nullTerminatedString, pStr->Buffer, pStr->Length);

    // create a BSTR
    BSTR bstrString = ::SysAllocString(nullTerminatedString);

    // tidy-up and return the BSTR
    delete [] nullTerminatedString;
    return bstrString;
}

还有
SysAllocStringLen
可以避免以null结尾的复制感谢您的回复。但我没有把它作为指针变量。我把它作为PUNICODE\u STRING\u变量。现在如何转换?如果这是个愚蠢的问题,请原谅。我对VC++和Win32 API完全陌生。将第一行更改为
(PUNICODE\u STRING pStr)
-无星-并将所有
pStr.
更改为
pStr->
-应该可以工作。也可以将
BSTR*bstrString
更改为仅
bstrString
。或者,一行程序
BSTR bstrString=::SysAllocStringLen(pStr->Buffer,pStr->Length)
也应该可以工作。感谢您的评论。我将尝试它并让您知道。是的,Rup的一行程序很好地完成了这项工作!我将编辑我的代码,以便它对后代是正确的。