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();
}
|
Но и так не получается . При использовании класса, билдер ругается, что не видит виртуальный метод func(). Вылетает даже если импортировать не весь класс, а только func_Borland().
Вопрос, собственно, в этом: что нужно сделать, чтобы виртуальные методы "увиделись" в билдере? |
|
Asher |
Отправлено: 16.03.2007, 09:30 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Объекты хранятся в разных компиляторах по разному, даже в разных версиях одного и того-же компилятора может отличаться, плюс различное выравнивание данных.
При наличии Lib наиболее реалистичным выглядит применени coff2omf и статическая линковка полученной библиотеки.
P.S. А вообще-то на выходных попробую поэкспериментировать.
P.P.S. Я свои шаблоны пишу параллельно в MSVC8 и BCppB6. если грабли обнаруживать сразу, то особых проблем по обходу нет.
На крайний случай всегда есть #ifdef __BCPLUSPLUS__
|
|
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, поэтому нет, не получится.
|
|