RUS  ENG 

Конфликт Zulu и OLE.

Страницы: 1
RSS
Конфликт Zulu и OLE.
 
Здравствуйте! Скажите, почему следующий корректно работающий код на C++ Builder 6 ...
Variant XL;
XL=CreateOleObject("Excel.Application");
XL.OlePropertySet("Visible",true);

..., перестает работать, как только добавляем строчку #include "ZuluOcx_OCX.h", вылетает ошибка (исключение) в 3-ей строке, а так же в OleProcedure(), OleFunction().
 
Скорее всего конфликт не с кодом Zulu, а в самом Builder'е, т.к. вылет в недрах Variant::OlePropertyGet возникает даже если не включать #include "ZuluOcx_OCX.h" в свой модуль, а просто добавить в проект ZuluOcx_OCX.cpp... (модули Zulu при выполнении тестового кода при этом и не загружаются)...

Как только мы разберемся в чем именно проблема, то сообщим как выйти из этой ситуацию...
 
Оказывается, что проблема с вылетом в методе OlePropertySet имеет широкое распространение в разных версиях C++Builder от 6.0 до 2007 (см. Google с запросом "OlePropertySet violation") и с разными проектами.

Расследование показывает, что в общем виде проблема в следующем: при использовании в проекте шаблона класса TAutoDriver<IDispatch>, C++Builder генерит код для этого шаблона с учетом размера объекта, отличающегося от того, который используется в недрах Vcl, в т.ч. в реализации метода Variant.OlePropertSet.

Код для Variant::OlePropertySet выглядит следующим образом:

// кусок CBuilder6\Source\Vcl\variant.cpp
void Variant::OlePropertySet(const String& name, TAutoArgsBase& args)
{
// Bind to IDispatch in this Variant
//
TAutoDriver<IDispatch> disp;
disp.Bind(*this /* operator LPDISPATCH() AddRef()s already */, false);

// Look up the dispid of the name passed
//
DISPID id;
OleCheck(disp.GetIDsOfNames(WideString(name), id));

// Do Invoke
//
OleCheck(disp.OlePropertyPut(id, args));
}

Как только TAutoDriver<IDispatch> встречается в нашем проекте, C++Builder скомпилирует его код c учетом настроек нашего проекта, а линкер включит именно эту версию реализации в исполняемый модуль, ОДНАКО размер объекта в этом случае оказывается на 4 байта меньше (если использовать стандартные настройки компиляции, предложенные по-умолчанию) и члены класса имеют иное смещение, чем те, что используются в коде Variant.OlePropertySet.

С автосгенеренном C++Builder'ом файле ZuluOcx_OCX.h встречается использование TAutoDriver<> с dispinterface'ами, а значит проблема инициируется.

Подобная проблема с TAutoDriver<IDispatch> также описывается в Borland Developer Network на Quality Central (см.qc.borland.com/wc/qcmain.aspx?d=55110), а также здесь (helpdesk.ingeardrivers.com/supportsuite/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=48).
Там предлагается изменить настройки проекта, убрав опцию "Zero length empty base class" параметрах C++, однако мне в тестовом проекте этот рецепт не помог (размер "нашего" TAutoDriver'а стал наоборот на 4 байта больше, чем в Vcl).

Я вышел из положения так: включил текст метода Variant::OlePropertySet (см. код выше) в тело своего проекта, заставив его тем самым скомпиляться с моими настройками проекта (и не зависить от них вообще) и все заработало...
При этом в параметрах Packages в настройках проекта я отключил флажок "Build with run-time packages"...
 
Большое спасибо! Все заработало!
 
Что такое случилось с моим компом?
открываю свою карту или пример любой сети и как нажимаю редактор слоя (карандашик)- вылетает
ошибка памя по такому то адресу
AppName: zulu.exe AppVer: 6.0.0.2985 ModName: zululib.dll
ModVer: 6.0.0.2985 Offset: 00255a21
 
Проблема с драйвером ключа. Такое возможно при установке другого софта со своими драйверами HASP (или другого типа ключа), либо может быть при установке софта с Hasp-эмулятором. Выход - надо переустановить драйвер HASP. Свежий драйвер можно скачать по ссылке на странице Download на нашем сайте. Драйвер надо сначала деинсталлировать (hinstall.exe -r), а потом установить заново (hinstall.exe -i).
Страницы: 1