| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. |
| Автор: EnergoHokum 19.8.2008, 11:35 |
| А разве формат vtable у всех компиляторов одинаков? Вроде, стандартом это не оговорено (если я ничего не путаю). vtable -- это-же список указателей на виртуальные функции-члены классов. А, вот ещё вспомнил, я sizeof-ом замерял размер указателей на виртуальные функции у VisualStudio и GCC, они оказались разными, у VSC он меньше. |
| Автор: Earnest 20.8.2008, 12:05 |
| Ты опять путаешь указатели на функции-члены с самими функциями. В виртуальной таблице хранятся обычные адреса (4 байта в Win32). И нет там никакого формата особого - таблица - она и в Африке таблица. Определяет ли стандарт порядок адресов, я не знаю точно, но думаю, что да - иначе бы COM не работал. Стандартом не определено, где находится указатель vtable в объекте. |