Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

2.1K
13 февраля 2004 года
VisualCraft
20 / / 24.11.2003
Работаю 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-окно, но строка не передается и не отображается!!! Все скомпилировано в режиме Debug (не UNICODE)

Ну ничего не понимаю. Как строковые параметры передавать? Да и указатели на структуры тоже непонятно как прередавать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог