Разве можно передавать L"text" там где BSTR? Ведь для передачи BSTR в начале стоит счетчик, а в примере передается обычная строка(обячная 2-х байтная конечно) БЕЗ счетчика. Ну не может же тут вызываться что то скрытно, какое нибудь преобразование?
D>Просматривая исходники MFC заметил следующее:
Ты это брось. Эот слишком кривая библиотека которая на сегодня (с выходом ATL/WTL 7.1) нафиг не упала. (Сужу по себе так как уже года 2 ни разу не использовал)
Здравствуйте, Tom, Вы писали:
D>>Просматривая исходники MFC заметил следующее: Tom>Ты это брось. Эот слишком кривая библиотека которая на сегодня (с выходом ATL/WTL 7.1) нафиг не упала. (Сужу по себе так как уже года 2 ни разу не использовал)
Что то не нашел я эту WTL7.1 (токо 7.0)
Может дашь ссылочку?
D>Разве можно передавать L"text" там где BSTR? Ведь для передачи BSTR в начале стоит счетчик, а в примере передается обычная строка(обячная 2-х байтная конечно) БЕЗ счетчика. Ну не может же тут вызываться что то скрытно, какое нибудь преобразование?
Если Вы посмотрите на то, как реализованы строки BSTR в C++, то увидите, что они представляют собой 4-х байтные указатели на строки 2-х байтных символов, завершающиеся 0x0000. В C++ НИКАКИХ счетчиков нет. Насколько я понимаю, они могут подсчитываться и передаваться при маршалинге. Поэтому ничего удивительного в тексте MFC нет.
Ответ, конечно, запоздалый, но мне Ваше письмо попалось на глаза только сейчас.
GREK
Re[2]: Интересный момент?
От:
Аноним
Дата:
17.12.05 06:16
Оценка:
Здравствуйте, Tom, Вы писали:
Tom>Ты это брось. Эот слишком кривая библиотека которая на сегодня (с выходом ATL/WTL 7.1) нафиг не упала. (Сужу по себе так как уже года 2 ни разу не использовал)
Для UI MFC всё ещё катит, особенно при использовании third-party библиотек, на ней базированных. А для всего остального, и СОМ в особенности MFC — полный отстой.
Re[2]: Интересный момент?
От:
Аноним
Дата:
17.12.05 10:56
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Если Вы посмотрите на то, как реализованы строки BSTR в C++, то увидите, что они представляют собой 4-х байтные указатели на строки 2-х байтных символов, завершающиеся 0x0000. В C++ НИКАКИХ счетчиков нет. Насколько я понимаю, они могут подсчитываться и передаваться при маршалинге. Поэтому ничего удивительного в тексте MFC нет.
Не очень понятно о чем это вы.
Отправлять WSTR туда, где ожидаеся BSTR — нельзя. Во-первых из-за возможного маршалинга именно как BSTR, во-вторых, клиент просто может вызвать что-нибудь BSTR-специфичное, вроде SysStringLen — и до свидания, ваша программа.
Я думаю, что тот человек, кторый писал это в MS просто очень хорошо знает, что происходит "на том конце" put_designMode. И никаких вызовов SysStringLen там нет.
PS. Я думаю, что использовать SysStringLen следует вообще с большой осторожностью и только в двух случаях — или в строке могут быть нули, или очень важна скорость работы (особенно при работе с длинными строками), и переберать все символы строки в поисках конца может быть накладно.
PPS. Есть еще один момент — в качестве пустого BSTR можно передвать NULL. Я думаю, что NULL в designMode "убъет" IE.
Здравствуйте, al, Вы писали:
al>Я думаю, что тот человек, кторый писал это в MS просто очень хорошо знает, что происходит "на том конце" put_designMode. И никаких вызовов SysStringLen там нет.
Тогда это хак. Завтра другой человек поменяет что нибудь в реализации put_designMode и возникнет проблема. Передавать WSTR вместо ожидаемой BSTR — ошибка, даже если такой код временно работает.
А>>Если Вы посмотрите на то, как реализованы строки BSTR в C++, то увидите, что они представляют собой 4-х байтные указатели на строки 2-х байтных символов, завершающиеся 0x0000. В C++ НИКАКИХ счетчиков нет. Насколько я понимаю, они могут подсчитываться и передаваться при маршалинге. Поэтому ничего удивительного в тексте MFC нет. А>Не очень понятно о чем это вы. А>Отправлять WSTR туда, где ожидаеся BSTR — нельзя. Во-первых из-за возможного маршалинга именно как BSTR, во-вторых, клиент просто может вызвать что-нибудь BSTR-специфичное, вроде SysStringLen — и до свидания, ваша программа.
Я приношу свои извинения и уточняю, что в реализацию BSTR в C++ входит и значение
длины строки в байтах и расположен этот счетчик длины в 4-х байтном слове, предшествующем собственно строке, т.е. по адресу = (значение указателя — 4),
откуда его и берет SysStringLen, деля его затем пополам. Так что возможность
использования передаваемой WSTR в методе put_designMode действительно ограничена,
хотя и не исключается вовсе. Как справедливо замечено кем-то ниже, это — "хак".
Здравствуйте, yso, Вы писали:
yso>Здравствуйте, Аноним, Вы писали:
А>>>Если Вы посмотрите на то, как реализованы строки BSTR в C++, то увидите, что они представляют собой 4-х байтные указатели на строки 2-х байтных символов, завершающиеся 0x0000. В C++ НИКАКИХ счетчиков нет. Насколько я понимаю, они могут подсчитываться и передаваться при маршалинге. Поэтому ничего удивительного в тексте MFC нет. А>>Не очень понятно о чем это вы. А>>Отправлять WSTR туда, где ожидаеся BSTR — нельзя. Во-первых из-за возможного маршалинга именно как BSTR, во-вторых, клиент просто может вызвать что-нибудь BSTR-специфичное, вроде SysStringLen — и до свидания, ваша программа.
yso>Я приношу свои извинения и уточняю, что в реализацию BSTR в C++ входит и значение yso>длины строки в байтах и расположен этот счетчик длины в 4-х байтном слове, предшествующем собственно строке, т.е. по адресу = (значение указателя — 4), yso>откуда его и берет SysStringLen, деля его затем пополам. Так что возможность yso>использования передаваемой WSTR в методе put_designMode действительно ограничена, yso>хотя и не исключается вовсе. Как справедливо замечено кем-то ниже, это — "хак".
Ну тогда следует уточнить и то, что в данном констексте говорить о РЕАЛИЗАЦИИ BSTR в С++ не верно, т.к. в С++ это не реализация таких строк, а всего то врапперы над АПИ функциями, а уж что и как там хранится это дело операционной системы а не компилятора.