RUS  ENG 

Zulu и Borland Developer Studio 2006

Страницы: 1
RSS
Zulu и Borland Developer Studio 2006
 
Здравствуйте!
Мы сделали проект под C++Builder6. Сейчас перешли на Builder Borland Developer Studio 2006.
Когда я делаю импорт ActiveX компонентов Zulu и затем устанавливаю, сразу выдаются ошибки компиляции и несовместимости типов. Например, в файле Zululib_TLB.h для IElemStyle объявлено:
virtual HRESULT STDMETHODCALLTYPE get_Font(IFontDisp*** pVal/*[out,retval]*/) = 0;
...
IFontDisp* __fastcall get_Font(void)
{
IFontDisp* pVal;
OLECHECK(this->get_Font(&pVal)); //здесь выдается ошибка
return pVal;
}

Если взять импортированные файлы из Builder6 и скопировать в BDS, они устанавливаются, и рабочий проект компилируется, но при запуске начинает выдавать ошибки EAccessViolation на самых простых функциях типа взятие ActiveIndex.
Что вы можете посоветовать?
 
По опыту работы с C++Builder, могу сказать, что как из версии 5-й в 6-ю, так и в Вашем случае, нельзя использовать файлы импорта из предыдущей версии - от версии к версии у Билдера меняются служебные классы (как неудачный TVariantInParam, продержавшийся только в 5-й версии) и после компиляции результат непредсказуем.
Здесь же, метод get_Font импортировался неправильно. Правильно так:
virtual HRESULT STDMETHODCALLTYPE get_Font(IFontDisp** pVal/*[out,retval]*/) = 0;
("IFontDisp**", а не "IFontDisp***")
а в методе-оболочка, где выдается ошибки, все правильно.
Тут остается только руками подправить там, где Билдер неправильно сгенерил объявления.
 
Не очень понятно, почему для всех дугих классов (кроме ILabelField, где возникает аналогичная ошибка)
функция выглядит как get_Font(IFontDisp*** pVal/*[out,retval]*/),
и при этом компилируется правильно.

И еще, если исправить для IElemStyle
virtual HRESULT STDMETHODCALLTYPE get_Font(IFontDisp** pVal/*[out,retval]*/) = 0;
то хочется исправить соответственно
virtual HRESULT STDMETHODCALLTYPE set_Font(IFontDisp* pVal/*[in]*/) = 0;
Но метод
virtual HRESULT STDMETHODCALLTYPE set_Font(IFontDisp** pVal/*[in]*/) = 0;
в BDS компилируется правильно.

Но допустим, я исправляю как вы написали, и еще также для
ISymbol::get_Picture(IPictureDisp*** pVal/*[out,retval]*/)

Еще выдается ошибка в ZuluOcx_OCX.h для TZuluCtrl на строке

__property Zululib_tlb::IZuluToolsPtr Tools={ read=get_Tools, write=set_Tools, stored=false };

"E2347 Parameter mismatch in write access specifier of property Tools"

Как быть здесь?
 
Билдер может и скомпилирует успешно, да потом вылетит, т.к. что IFontDisp***, что IPictureDisp*** совсем не правильно.
Методы get/set для свойств должны звучать так:
HRESULT Класс::get_Что-то( IЧто-то ** pVal);
HRESULT Класс::set_Что-то( IЧто-то * pVal);
Проверьте, наверняка в 6-м Билдере именно так.
Подобныйе глюки у Борланда не первый раз уже.
В 6-м Дельфи при импорте tlb, та вообще результат не
присваивала в методе-оболочке - метод возвращал мусор просто,
программа вылетала.
По поводу свойста Tools:
как звучит объявления get_Tools, set_Tools ?

PS Попробуем у себя поставить BDS и посмотреть как он импортирует наши библиотеки,
может получится выработать рекомендации на будущее.
 
Методы объявлены как
Zululib_tlb::IZuluTools* __fastcall get_Tools();
void __fastcall set_Tools(Zululib_tlb::IZuluTools* param);

В Builder6 они объявлены также, а вот свойство
__property Zululib_tlb::IZuluToolsPtr Tools={ read=get_Tools, stored=false };
Я исправляла также, все скомпилирова, но рабочая программа вылетает.

Кстати насчет IFontDisp*** - в Builder6 объявлено именно так, а реализация
IFontDisp** __fastcall get_Font(void)
{
IFontDisp** pVal;
OLECHECK(this->get_Font((IFontDisp***)&pVal));
return pVal;
}
Поэтому я думала, что именно так правильно. (И ведь все работает!)
В общем-то я могу послать импортированные исходники на mail, если так будет удобнее
 
Да, пришлите импортированные исходники на [email protected] (Дмитрий).
Как я уже говорил код get_Font может и правильный по синтаксису и компилируется нормально,
но он неправильный по смыслу.
 
Я отправила Вам исходники, импортированные 6 и 7 билдером.
Кстати, я пробовала импортировать в BDS, но в Delphi - там компоненты скомпилировались и установились без ошибок. А вообще, на каком языке лучше работать с Zulu? На Basic переходить не хочется, может с Delphi будет меньше проблем, чем с Builder?
И еще. Мы сделали демонстрационное приложение на демо-версии Zulu. Сейчас собираемся покупать рабочую версию, но остаются вопросы. Сама среда разработки иногда вылетает с AccessViolation. Обычно в режиме редактирования, но вчера даже по пункту меню \"О программе\". С рабочей версией такое случается?
 
Подобные проблемы с импортом наблюдаются только с Билдером, и то версии 6 и выше. 5-й Билдер все импортирует без проблем. На каком языке писать - для Zulu неважно. Пишут и на Delphi и на Basic'е и на Visual C++, пишут и на Билдере. Другое дело, что у Билдера есть такой вот нюанс (и не один в процессе его использования). Тут уж от вас, программистов-пользователей тоже многое зависит. Если квалификация позволяет, то нюансы эти можно обходить, и они не сильно будут раздражать. Но разрабатывать на Delphi конечно же проще.
По поводу вылетов:
Оболочка у нас не первый год "вылизывается" и вылеты (access violation) случаются крайне редко, и уж никак не в тривиальной команде "О программе". Возможно следующее:
Либо модули программы от разных версий (установка и обновление производилась несколько раз, в разные папки)
Либо вылет происходит не в модуле самой Zulu, а в модуле расширения (plug-ine). Можно проверить в отладчике.
На всякий случай я бы переустановил свежую версию Zulu, удалив предыдущие инсталляции.

Присланные файлы я посмотрю и отвечу на письмо.
 
Спасибо за исправления. Но, к сожалению, с новыми текстами тоже не получилось. Подробности в письме.
 
Файлы импорта, искореженные Билдером, еще подправил...
Страницы: 1