Re[3]: Проблема с маршалингом BSTR
От: k.o. Россия  
Дата: 27.06.11 19:17
Оценка:
Здравствуйте, vdoscorp, Вы писали:

V>Здравствуйте, k.o., Вы писали:


KO>>Здравствуйте, vdoscorp, Вы писали:


V>>>Есть COM-интерфейс ISourceDB


V>>>IdentificationDB получается на ура. А DataSourse приходит пустой.

V>>>Не подскажете в чем проблема?

KO>>А какой тип у pDB->DBName?


V>TCHAR


"Я знал, что ты скажешь это." Вообще, наверно, даже не TCHAR, а TCHAR*? Между BSTR и TCHAR* есть большая разница, дело в том, что для BSTR хранится длина строки, например, для BSTR со значением "test" память будет выглядеть так:
[0x04000000|test\0]

сама переменная при этом будет указывать на начало строки "test", т.е. сразу на область памяти после размера. (хотя, всё это, по идее, implementation defined)

в любом случае, правильный код должен быть таким:

BSTR dbName = SysAllocString(pDB->DBName);
pElem->put_DataSourse(dbName);
SysFreeString(dbName);


Без этого возможны различные спецэффекты, пустой DataSource, пожалуй, самый безобидный результат.

Disclaimer: проверка ошибок, использование _bstr_t/CComBSTR и т.д. и т.п. оставляются читателю, в качестве упражнения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.