![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: 3 Всего: 6 |
Проблема, собс-сно, такова: есть базовое приложение, и DLL-ки, в которых реализован дополнительный функционал. Из DLL-ки наружу торчит C-функция, которая принимает идентификатор класса (реализующего всякое дополнительное), и отдаёт указатель на него. Все классы унаследованы от одного интерфейса. Интерфейс содержит несколько функций. Основная программа через полученные указатели вызывает эти функции (определённые в классах-наследниках). Если DLL скомпилирована не тем компилятором, каким основная программа, при попытке вызова функций всё segfault-ится. Это связано с различным представлением указателей на функции-члены у разных компиляторов? Если да, то подскажите, как это обходится в COM (а я пока погуглю).
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
Возможно необходимо сменить calling convention. По дефолту для прог на С++ -- это __cdecl, а нужен __stdcall.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
У тебя ведь не указатели на функции-члены, а виртуальные функции, а это ведь разные вещи... Так что, скорее всего прав W4FhLF - проблема в разных спецификациях вызова. ИМХО, не важно, какие, главное, чтобы одинаковые были. -------------------- ... |
|||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: 3 Всего: 6 |
А разве формат vtable у всех компиляторов одинаков? Вроде, стандартом это не оговорено (если я ничего не путаю). vtable -- это-же список указателей на виртуальные функции-члены классов.
А, вот ещё вспомнил, я sizeof-ом замерял размер указателей на виртуальные функции у VisualStudio и GCC, они оказались разными, у VSC он меньше. Это сообщение отредактировал(а) EnergoHokum - 19.8.2008, 11:37 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ты опять путаешь указатели на функции-члены с самими функциями. В виртуальной таблице хранятся обычные адреса (4 байта в Win32). И нет там никакого формата особого - таблица - она и в Африке таблица. Определяет ли стандарт порядок адресов, я не знаю точно, но думаю, что да - иначе бы COM не работал. Стандартом не определено, где находится указатель vtable в объекте.
-------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |