Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Указатели на функции-члены классов


Автор: EnergoHokum 15.8.2008, 15:06
Проблема, собс-сно, такова: есть базовое приложение, и DLL-ки, в которых реализован дополнительный функционал. Из DLL-ки наружу торчит C-функция, которая принимает идентификатор класса (реализующего всякое дополнительное), и отдаёт указатель на него. Все классы унаследованы от одного интерфейса. Интерфейс содержит несколько функций. Основная программа через полученные указатели вызывает эти функции (определённые в классах-наследниках). Если DLL скомпилирована не тем компилятором, каким основная программа, при попытке вызова функций всё segfault-ится. Это связано с различным представлением указателей на функции-члены у разных компиляторов? Если да, то подскажите, как это обходится в COM (а я пока погуглю).

Автор: W4FhLF 15.8.2008, 16:01
Возможно необходимо сменить calling convention. По дефолту для прог на С++ -- это __cdecl, а нужен __stdcall.

Автор: Earnest 18.8.2008, 10:38
Цитата(EnergoHokum @  15.8.2008,  16:06 Найти цитируемый пост)
Это связано с различным представлением указателей на функции-члены у разных компиляторов? 

У тебя ведь не указатели на функции-члены, а виртуальные функции, а это ведь разные вещи...
Так что, скорее всего прав W4FhLF - проблема в разных спецификациях вызова. ИМХО, не важно, какие, главное, чтобы одинаковые были.

Автор: EnergoHokum 19.8.2008, 11:35
А разве формат vtable у всех компиляторов одинаков? Вроде, стандартом это не оговорено (если я ничего не путаю). vtable -- это-же список указателей на виртуальные функции-члены классов.
А, вот ещё вспомнил, я sizeof-ом замерял размер указателей на виртуальные функции у VisualStudio и GCC, они оказались разными, у VSC он меньше.

Автор: Earnest 20.8.2008, 12:05
Ты опять путаешь указатели на функции-члены с самими функциями. В виртуальной таблице хранятся обычные адреса (4 байта в Win32). И нет там никакого формата особого - таблица - она и в Африке таблица. Определяет ли стандарт порядок адресов,  я не знаю точно, но думаю, что да - иначе бы COM не работал. Стандартом не определено, где находится указатель vtable в объекте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)