Как конвертировать из nsACString в LPCWSTR? - PullRequest
2 голосов
/ 14 декабря 2009

Я делаю расширение для Firefox (nsACString от mozilla), но LoadLibrary ожидает LPCWSTR. Я гуглил несколько вариантов, но ничего не получалось. Вроде из моей глубины со строками, поэтому любые ссылки также будут оценены.

Ответы [ 3 ]

2 голосов
/ 14 декабря 2009

Зависит от того, содержит ли ваша 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 никогда не приводит к большему количеству символов, чем было введено байтов.

1 голос
/ 14 декабря 2009

Первое примечание: LoadLibrary не нужно принимать LPWSTR. Только LoadLibraryW делает. Вы можете позвонить LoadLibraryA напрямую (передавая узкий LPCSTR), и он выполнит перевод для вас.

Однако, если вы решите сделать это самостоятельно, ниже приведен один из возможных примеров.

nsACString sFoo = ...;  // Some string.
size_t len = sFoo.Length() + 1;
WCHAR *swFoo = new WCHAR[len];
MultiByteToWideChar(CP_ACP, 0, sFoo.BeginReading(), len - 1, swFoo, len);
swFoo[len - 1] = 0;  // Null-terminate it.

...

delete [] swFoo;
0 голосов
/ 14 декабря 2009

nsACString a;

const char * pData; PRUint32 iLen = NS_CStringGetData (a, & pData);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...