Есть DLL'ка написанная на Visual C++.
Не получается из Builder'a корректно вызвать определенную в DLL виртуальную функцию класса.
Класс описан в header'е, он не экспортируется и реализован в DLL.
Header подключен и в билдере и в DLL, сама DLL подключается динамически.
При вызове функции из Builder управление попадает в нужную функцию, но в this лежит мусор.
Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?
Здравствуйте, KPavel, Вы писали:
KP>Не получается из Builder'a корректно вызвать определенную в DLL виртуальную функцию класса.
[] KP>Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?
А можно хидер и код вызова функции из dll в студию?
Здравствуйте, KPavel, Вы писали:
KP>Привет!
KP>При вызове функции из Builder управление попадает в нужную функцию, но в this лежит мусор. KP>Возможно, Builder и Visual C по-разному работают с виртуальными функциями? Как обойти эту проблему с минимальными издержками?
ВИДИМО, ПО-ЛЮДСКИ, НИКАК
МОЖНО ЗАНЯТЬСЯ ГРЯЗНЫМ ХАКОМ, НО ЭТО УЖЕ ДЕЛО СУГУБО ЛИЧНОЕ
Здравствуйте, 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 пишите.
В общем разобрался с проблемой (спасибо добрым людям с 26-го форума IXBT )
Проблема изначально в различиях calling convention при вызове методов класса у BCB и VC. Причем не спасает даже явное указание одинаковой конвенции на обеих сторонах.