Вызов виртуальной функции в DLL
От: KPavel Россия  
Дата: 10.12.03 13:01
Оценка:
Привет!

Есть DLL'ка написанная на Visual C++.
Не получается из Builder'a корректно вызвать определенную в DLL виртуальную функцию класса.
Класс описан в header'е, он не экспортируется и реализован в DLL.
Header подключен и в билдере и в DLL, сама DLL подключается динамически.
При вызове функции из Builder управление попадает в нужную функцию, но в this лежит мусор.
Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?

Спасибо!
Re: Вызов виртуальной функции в DLL
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 10.12.03 15:10
Оценка:
Здравствуйте, KPavel, Вы писали:

KP>Не получается из Builder'a корректно вызвать определенную в DLL виртуальную функцию класса.

[]
KP>Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?

А можно хидер и код вызова функции из dll в студию?
Re: Вызов виртуальной функции в DLL
От: s.ts  
Дата: 10.12.03 16:32
Оценка:
Здравствуйте, KPavel, Вы писали:

KP>Привет!


KP>При вызове функции из Builder управление попадает в нужную функцию, но в this лежит мусор.

KP>Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?

ВИДИМО, ПО-ЛЮДСКИ, НИКАК
МОЖНО ЗАНЯТЬСЯ ГРЯЗНЫМ ХАКОМ, НО ЭТО УЖЕ ДЕЛО СУГУБО ЛИЧНОЕ
... << RSDN@Home 1.1.0 stable >>
Re: Вызов виртуальной функции в DLL
От: Ulin США  
Дата: 30.10.05 09:51
Оценка:
Здравствуйте, KPavel, Вы писали:

KP>Привет!


KP>Есть DLL'ка написанная на Visual C++.

KP>Не получается из Builder'a корректно вызвать определенную в DLL виртуальную функцию класса.
KP>Класс описан в header'е, он не экспортируется и реализован в DLL.
KP>Header подключен и в билдере и в DLL, сама DLL подключается динамически.
KP>При вызове функции из Builder управление попадает в нужную функцию, но в this лежит мусор.
KP>Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?

KP>Спасибо!


Господа, ситуация практически аналогичная, за исключением того, что виртуальные методы определены под CBuilder, а вызов их идет из dll, писанной на VC — попадаю в нужный метод, но в this мусор. При этом в другой реализации, когда виртуальные методы определены в проге, писанной на VC вызовы виртуальных методов из dll проходят на ура, то есть трабла очевидно в переходе VC -> BCB.

Это вообще как-то лечится? Или ткните носом в тему, где это обсуждалось, plz, если она есть. Поиск по "виртуал Visual" ничего не дает
Re: Вызов виртуальной функции в DLL
От: Аноним  
Дата: 31.10.05 18:19
Оценка:
Здравствуйте, KPavel, Вы писали:

KP>Привет!


KP>Есть DLL'ка написанная на Visual C++.

KP>Не получается из Builder'a корректно вызвать определенную в DLL виртуальную функцию класса.
KP>Класс описан в header'е, он не экспортируется и реализован в DLL.
KP>Header подключен и в билдере и в DLL, сама DLL подключается динамически.
KP>При вызове функции из Builder управление попадает в нужную функцию, но в this лежит мусор.
KP>Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?

KP>Спасибо!


ИМХО, причина в несовместимости представлений классов у MS и Borland на бинарном уровне.
Обычно, при необходимости дергать методы классов из DLL, делают так:
пишется набор функций-оберток, именно они и экспортируются, больше наружу ничего из DLL не торчит
Например,
DWORD MYAPI_CreateInstance(); // создает экземпляр класса и возвращает указатель на него
void MYAPI_KillInstnace(DWORD inst); // убивает экземпляр класса
... MYAPI_MyMethod(DWORD inst, ...); // делегирование вызова методу MyMethod у переданного экземпляра класса, параметры и возвращаемое значение 100% как у метода класса

И никаких граблей. При желании, на клиентской стороне можно сбацать класс-обертку, который все это будет пользовать.
Хоть на Delphi пишите.
Re[2]: Вызов виртуальной функции в DLL
От: Ulin США  
Дата: 01.11.05 10:12
Оценка:
В общем разобрался с проблемой (спасибо добрым людям с 26-го форума IXBT )

Проблема изначально в различиях calling convention при вызове методов класса у BCB и VC. Причем не спасает даже явное указание одинаковой конвенции на обеих сторонах.

Решения я нашел 2:

1-е — хак, находящийся на сайте http://wwwtcs.inf.tu-dresden.de/~dc1/conditional/ — там в файле f_ConditionIFPWrap.cpp реализован враппер вызова методов класса.

2-е — использовать borland specific calling convention '__msfastcall'

1-е не проверял, а 2-е работает на ура.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.