Страница 1 из 1

SysAllocStringLen

Добавлено: 04 окт 2005, 08:41
dima
Сижу, думаю, читаю 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 в данном сценарии ?

Re: SysAllocStringLen

Добавлено: 04 окт 2005, 09:25
ajkj3em
можно, но тогда bstr нельзя будет передавать назад в win32 api, который моментально начнет валится на чем-нибудь типа win98-se2-gold-chinese edition, release 2 ... если в win32 api существует "ненужная" функция - будь спокоен, она затыкает какой-то страшный баг в другой части api.

Добавлено: 06 окт 2005, 22:45
ura
Нет нельзя, поскольку SysAllocString выделяет память для типа BSTR и хотя он с виду обычный WCHAR но на самом деле еще и содержит длину строки где то в конце и является специальным типом для работы со строками совместимым с VB строками. Для передачи строк через методы IDispatch dual интерфейсов годятся только BSTR.

Добавлено: 07 окт 2005, 07:14
vg
ura писал(а):Нет нельзя, поскольку SysAllocString выделяет память для типа BSTR и хотя он с виду обычный WCHAR но на самом деле еще и содержит длину строки где то в конце и является специальным типом для работы со строками совместимым с VB строками. Для передачи строк через методы IDispatch dual интерфейсов годятся только BSTR.
Да, только, если не ошибаюсь, длина строки, указывается в начале, как у паскалистов.

Добавлено: 07 окт 2005, 22:07
ura
точно, вот она старость не радость... :oops: