我正在做一个Firefox扩展(nsACString来自mozilla),但是LoadLibrary需要一个LPCWSTR。我用谷歌搜索了一些选项,但没有任何效果。用字符串有点超出我的深度,因此任何引用也将不胜感激。
最佳答案
这取决于您的nsACString(我将其称为str
)是否保存ASCII或UTF-8数据:
ASCII码
std::vector<WCHAR> wide(str.Length()+1);
std::copy(str.beginReading(), str.endReading(), wide.begin());
// I don't know whether nsACString has a terminating NUL, best to be sure
wide[str.Length()] = 0;
LPCWSTR newstr = &wide[0];
UTF-8
// get length, including nul terminator
int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
str.BeginReading(), str.Length(), 0, 0);
if (len == 0) panic(); // happens if input data is invalid UTF-8
// allocate enough space
std::vector<WCHAR> wide(len);
// convert string
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
str.BeginReading(), str.Length(), &wide[0], len)
LPCWSTR newstr = &wide[0];
这只会分配所需的空间-如果您想要更快的代码,可能使用的内存超出了必要,则可以将前两行替换为:
int len = str.Length() + 1;
之所以可行,是因为从UTF-8到WCHAR的转换永远不会产生比输入字节数更多的字符。
关于c++ - 如何从nsACString转换为LPCWSTR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1900756/