Re: Интересный момент?
От: Аноним  
Дата: 16.12.05 18:01
Оценка: -2
Здравствуйте, Denwer, Вы писали 2.5 года тому назад:


D>Просматривая исходники MFC заметил следующее:

D> return S_OK == spDoc->put_designMode(L"On") ? TRUE : FALSE; // вот тут собака порылась


D>Это определение:


D>virtual HRESULT STDMETHODCALLTYPE put_designMode (BSTR v) = 0


D>Разве можно передавать L"text" там где BSTR? Ведь для передачи BSTR в начале стоит счетчик, а в примере передается обычная строка(обячная 2-х байтная конечно) БЕЗ счетчика. Ну не может же тут вызываться что то скрытно, какое нибудь преобразование?


Если Вы посмотрите на то, как реализованы строки BSTR в C++, то увидите, что они представляют собой 4-х байтные указатели на строки 2-х байтных символов, завершающиеся 0x0000. В C++ НИКАКИХ счетчиков нет. Насколько я понимаю, они могут подсчитываться и передаваться при маршалинге. Поэтому ничего удивительного в тексте MFC нет.

Ответ, конечно, запоздалый, но мне Ваше письмо попалось на глаза только сейчас.

GREK
Re[3]: Интересный момент?
От: Tom Россия http://www.RSDN.ru
Дата: 04.08.03 07:44
Оценка: :)
D>Может дашь ссылочку?
Нету такой ещё. Но будет Вот Алекс баги все повылавливает и будет 7.1
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re[4]: Интересный момент?
От: Аноним  
Дата: 19.12.05 14:28
Оценка: +1
Здравствуйте, al, Вы писали:

al>Я думаю, что тот человек, кторый писал это в MS просто очень хорошо знает, что происходит "на том конце" put_designMode. И никаких вызовов SysStringLen там нет.

Тогда это хак. Завтра другой человек поменяет что нибудь в реализации put_designMode и возникнет проблема. Передавать WSTR вместо ожидаемой BSTR — ошибка, даже если такой код временно работает.
Интересный момент?
От: Denwer Россия  
Дата: 01.08.03 12:04
Оценка:
Просматривая исходники MFC заметил следующее:


        BOOL SetDesignMode(BOOL bMode) const
    {
        const T* pT = static_cast<const T*>(this);
        CComPtr<IHTMLDocument2> spDoc;
        pT->GetDHtmlDocument(&spDoc);
        if (spDoc)
        {
            if (bMode)
                return S_OK == spDoc->put_designMode(L"On") ? TRUE : FALSE; // вот тут собака порылась
            else
                return S_OK == spDoc->put_designMode(L"Off") ? TRUE : FALSE; // и вот тут тоже
        }
        return FALSE;
    }


Это определение:


virtual HRESULT STDMETHODCALLTYPE put_designMode (BSTR v) = 0


Разве можно передавать L"text" там где BSTR? Ведь для передачи BSTR в начале стоит счетчик, а в примере передается обычная строка(обячная 2-х байтная конечно) БЕЗ счетчика. Ну не может же тут вызываться что то скрытно, какое нибудь преобразование?
Re: Интересный момент?
От: Tom Россия http://www.RSDN.ru
Дата: 01.08.03 12:12
Оценка:
D>Просматривая исходники MFC заметил следующее:
Ты это брось. Эот слишком кривая библиотека которая на сегодня (с выходом ATL/WTL 7.1) нафиг не упала. (Сужу по себе так как уже года 2 ни разу не использовал)
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re[2]: Интересный момент?
От: Denwer Россия  
Дата: 04.08.03 06:41
Оценка:
Здравствуйте, Tom, Вы писали:

D>>Просматривая исходники MFC заметил следующее:

Tom>Ты это брось. Эот слишком кривая библиотека которая на сегодня (с выходом ATL/WTL 7.1) нафиг не упала. (Сужу по себе так как уже года 2 ни разу не использовал)

Что то не нашел я эту WTL7.1 (токо 7.0)
Может дашь ссылочку?
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 — и до свидания, ваша программа.
Re[3]: Интересный момент?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 18.12.05 13:53
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Что то не нашел я эту WTL7.1 (токо 7.0)

D>Может дашь ссылочку?

да уж 8.0 есть — [ANN] WTL 8.0.5347
Автор: BuHHunyx
Дата: 13.12.05
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Интересный момент?
От: al Россия  
Дата: 19.12.05 12:56
Оценка:
Я думаю, что тот человек, кторый писал это в MS просто очень хорошо знает, что происходит "на том конце" put_designMode. И никаких вызовов SysStringLen там нет.

PS. Я думаю, что использовать SysStringLen следует вообще с большой осторожностью и только в двух случаях — или в строке могут быть нули, или очень важна скорость работы (особенно при работе с длинными строками), и переберать все символы строки в поисках конца может быть накладно.


PPS. Есть еще один момент — в качестве пустого BSTR можно передвать NULL. Я думаю, что NULL в designMode "убъет" IE.


Re[3]: Интересный момент?
От: yso Россия  
Дата: 20.12.05 12:22
Оценка:
Здравствуйте, Аноним, Вы писали:


А>>Если Вы посмотрите на то, как реализованы строки BSTR в C++, то увидите, что они представляют собой 4-х байтные указатели на строки 2-х байтных символов, завершающиеся 0x0000. В C++ НИКАКИХ счетчиков нет. Насколько я понимаю, они могут подсчитываться и передаваться при маршалинге. Поэтому ничего удивительного в тексте MFC нет.

А>Не очень понятно о чем это вы.
А>Отправлять WSTR туда, где ожидаеся BSTR — нельзя. Во-первых из-за возможного маршалинга именно как BSTR, во-вторых, клиент просто может вызвать что-нибудь BSTR-специфичное, вроде SysStringLen — и до свидания, ваша программа.

Я приношу свои извинения и уточняю, что в реализацию BSTR в C++ входит и значение
длины строки в байтах и расположен этот счетчик длины в 4-х байтном слове, предшествующем собственно строке, т.е. по адресу = (значение указателя — 4),
откуда его и берет SysStringLen, деля его затем пополам. Так что возможность
использования передаваемой WSTR в методе put_designMode действительно ограничена,
хотя и не исключается вовсе. Как справедливо замечено кем-то ниже, это — "хак".
Re[4]: Интересный момент?
От: Denwer Россия  
Дата: 20.12.05 12:30
Оценка:
Здравствуйте, 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 в С++ не верно, т.к. в С++ это не реализация таких строк, а всего то врапперы над АПИ функциями, а уж что и как там хранится это дело операционной системы а не компилятора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.