Форум программистов, компьютерный форум CyberForum.ru

Строковые типы в ATL. Очень странная фича!!!, самопроизвольно BSTR -> LPCTSTR - C++

Восстановить пароль Регистрация
 
Visual_Craft
Сообщений: n/a
22.04.2010, 20:36     Строковые типы в ATL. Очень странная фича!!!, самопроизвольно BSTR -> LPCTSTR #1
Работаю VC++ 6.0, Два приложения ATL сервер и MFC OLE контейнер

В сервере в классе ATL метод
idl) [id(2), helpstring('method ATLMessageBSTR')] HRESULT ATLMessageBSTR([in] BSTR olestr);
h) STDMETHOD(ATLMessageBSTR)(BSTR olestr);
cpp) STDMETHODIMP CATLTest::ATLMessageBSTR(BSTR olestr)
{char chars[256]; wcstombs((CHAR*)&chars,(OLECHAR*)&olestr,sizeof(chars));
MessageBox(0,chars,'Probe',0); return S_OK;}

В клиенте из TLB генерится следующий код
h)void ATLMessageBSTR(LPCTSTR olestr);
cpp)void IATLTest::ATLMessageBSTR(LPCTSTR olestr){static BYTE parms[] =VTS_BSTR;
InvokeHelper(0x2, DISPATCH_METHOD, VT_EMPTY, NULL, parms, olestr);}

Вызов метода
char chars[20]; strcpy(chars,'This is CHAR STR');
IATLTest atlcl; atlcl.CreateDispatch('ATLServer.ATLTest.1');
atlcl.ATLMessageBSTR(chars);

Обратите внимание был объявлен тип BSTR(т.к. другие строковые типы не компиляцца, ибо недопустимы по соглашениям ATL, см.документацию), а посылаю ему (char *) т.к. если туда сунуть что либо другое, будет ошибка компиляции.

Почему BSTR превратился в LPCTSTR?
Кто-нибудь объяснит популярно в чем философский смысл такого странного преобразования?

И ни одного предупреждения, ни ошибок.
Вызов метода работает, выскакивает вызываемое ATL-окно, но строка не передается и не отображается, точнее неправильно передается. Попробовал передавать как указатель long *, Отображаются только первые 4 буквы. Все скомпилировано в режиме Debug (не UNICODE)

Ну ничего не понимаю. Как строковые параметры передавать? Да и указатели на структуры тоже непонятно как передавать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2010, 20:36     Строковые типы в ATL. Очень странная фича!!!, самопроизвольно BSTR -> LPCTSTR
Посмотрите здесь:

Строковые типы данных. Обработка строк C++
Очень странная ошибка: Функция gets() вызывается только со второго раза C++
C++ Строковые типы данных (заменить все прописные (большие) буквы латинского алфавита строчными (маленькими))
Строковые типы данных C++
очень странная ошибка с++ C++
C++ очень очень странная ошибка
C++ Странная ошибка при компиляции очень очень большой проги ,,boomerang,,
C++ Исправить ошибки, строковые типы данных

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 21:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru