Сижу, думаю, читаю MSDN - нифига понять не могу.
Вот имплементация Microsofta
inline BSTR A2WBSTR(LPCSTR lp, int nLen = -1)
{
USES_CONVERSION;
BSTR str = NULL;
int nConvertedLen = MultiByteToWideChar(_acp, 0, lp, nLen, NULL, NULL)-1;
str = ::SysAllocStringLen(NULL, nConvertedLen);
if (str != NULL)
{
MultiByteToWideChar(_acp, 0, lp, -1, str, nConvertedLen);
}
return str;
}
Беспокоит след вопрос. Можно-ли алокировать память через NEW вместо ::SysAllocStringLen в данном сценарии ?
SysAllocStringLen
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- dima
- Житель
- Сообщения: 690
- Зарегистрирован: 19 фев 2003, 19:26
- Откуда: Хабаровск->Toronto
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
Re: SysAllocStringLen
можно, но тогда bstr нельзя будет передавать назад в win32 api, который моментально начнет валится на чем-нибудь типа win98-se2-gold-chinese edition, release 2 ... если в win32 api существует "ненужная" функция - будь спокоен, она затыкает какой-то страшный баг в другой части api.
-
- Житель
- Сообщения: 915
- Зарегистрирован: 09 мар 2003, 22:46
Нет нельзя, поскольку SysAllocString выделяет память для типа BSTR и хотя он с виду обычный WCHAR но на самом деле еще и содержит длину строки где то в конце и является специальным типом для работы со строками совместимым с VB строками. Для передачи строк через методы IDispatch dual интерфейсов годятся только BSTR.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Да, только, если не ошибаюсь, длина строки, указывается в начале, как у паскалистов.ura писал(а):Нет нельзя, поскольку SysAllocString выделяет память для типа BSTR и хотя он с виду обычный WCHAR но на самом деле еще и содержит длину строки где то в конце и является специальным типом для работы со строками совместимым с VB строками. Для передачи строк через методы IDispatch dual интерфейсов годятся только BSTR.
-
- Житель
- Сообщения: 915
- Зарегистрирован: 09 мар 2003, 22:46