C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вызов виртуальных методов из dll, созданной в VC++
Grim
Отправлено: 16.03.2007, 00:51


Ученик-кочегар

Группа: Участник
Сообщений: 2



Столкнулся со следующей проблемой.

Исходная задача — программа на Delphi, с использованием библиотеки GLScene (http://glscene.org). Требуется использовать дополнительно библиотеку для расчета освещения Lightsprint (http://lightsprint.com). Библиотека поставляется в виде dll+lib+h, откомпилированными в Visual C++ 2005.

Самым простым и логичным решением было бы сделать кусок программы, который использует Lightsprint в билдере, поскольку GLScene так же работает в нем и можно получить доступ ко всем объектам в основной программе на Delphi без всяких wrapper'ов.

Я списался с автором Lightsprint, он проявил интерес к использованию библиотеки в билдере. Но тут как раз возникло несколько проблем.
Откомпилировать библиотеку в билдере нельзя, борландовская реализация темплейтов отличается от VC.
Билдер "не видит" виртуальных методов в dll, откомпилированной в VC.

Автор Lightsprint предложил сделать для каждого виртуального метода его невиртуального двойника:
CODE

// this is in public Lightsprint header
class Class
{
   virtual void func(); // old one
   void func_Borland(); // new one for you
}
// this is in private lightsprint cpp
void Class::func_Borland()
{
   func();
}

Но и так не получается sad.gif. При использовании класса, билдер ругается, что не видит виртуальный метод func(). Вылетает даже если импортировать не весь класс, а только func_Borland().

Вопрос, собственно, в этом: что нужно сделать, чтобы виртуальные методы "увиделись" в билдере?
Asher
Отправлено: 16.03.2007, 09:30


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Объекты хранятся в разных компиляторах по разному, даже в разных версиях одного и того-же компилятора может отличаться, плюс различное выравнивание данных.

При наличии Lib наиболее реалистичным выглядит применени coff2omf и статическая линковка полученной библиотеки.

P.S. А вообще-то на выходных попробую поэкспериментировать.
P.P.S. Я свои шаблоны пишу параллельно в MSVC8 и BCppB6. если грабли обнаруживать сразу, то особых проблем по обходу нет.
На крайний случай всегда есть #ifdef __BCPLUSPLUS__ biggrin.gif
Asher
Отправлено: 16.03.2007, 09:39


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.

В догонку.
В "Стандарты программирования на C++. 101 правило и рекомендация"
Герб Саттер, Андрей Александреску

в совете 39. "Виртуальные функции стоит делать неоткрытыми, а открытые — невиртуальными"

Рекомендуют все интерфейсные функции делать невиртуальными, вызывающими защищенные/закрытые виртуальные функции.
Grim
Отправлено: 16.03.2007, 10:41


Ученик-кочегар

Группа: Участник
Сообщений: 2



Спасибо за ответ.

Так в принципе-то возможно использовать классы, описанные в VC в билдере? А то у меня уже начали закрадываться сомнения...
Насчет виртуальных функций (из письма автора Lightsprint):
QUOTE

It's technically possible to change API and remove all static member functions.
But virtual member functions are essential, I can't remove them.

I don't see any reasonable way to remove virtual funcs from API.

Так что отбрыкнуться от виртуальных методов здесь не получается.
За идею с coff2omf спасибо, надо будет попробовать.
Asher
Отправлено: 16.03.2007, 11:03


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
QUOTE
Так в принципе-то возможно использовать классы, описанные в VC в билдере? А то у меня уже начали закрадываться сомнения...

нет единого ABI, поэтому нет, не получится.

Вернуться в Вопросы программирования в C++Builder