![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Всем привет.
Ребята, я уже описывала эту проблеу, и честно думала, что она у меня благополуно решина http://forum.vingrad.ru/index.php?showtopic=47242 В кратце ситуация была такая, для класс наследуется от некого интерфейса (структуры с объявлением чистовиртуальных функций). В dll модель подключается описание это интерфейса, а при вызове функции dll передается указетль на объект моего класса, функция соответственно юзает методы класса. Все очень хорошо, но когда основной модуль созается в visualStudio, а сама dll пишется на Borland (это принципиально) возникают траблы, связанные с тем, что компиляторы, по разному создают таблицы виртульных функций. Можно ли решить эту проблему, если да, то как????? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Ты в этом абсолютно уверена? Метод создания виртуалных таблиц весьма прост и очевиден в реализации, что обычно все компиляторы реализуют его одинаково. Даже Делфи, например. Единственно, разница может заключатся в умолчаниях. В VS, соглашение вызовов по умолчанию cdecl, а в Борланде fastcall, вроде. Если соглашение одинаковое, посмотри ключевое слово interface в Борланде, если оно там есть используй его (в VC оно точно есть). Это слово специально было введено для обозначения COM интерфейсов, а вызовы к ним унифицированны стандартом. -------------------- Волны гасят ветер... |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
В принципе, если ты на 100% процентов уверенна, что ДЛЛ экспортирует всё и только то что должен, то Win32 API компотобильность должна соблюдаться.. насчёт C++-ных штук - сумлеваюсь, что проблема в несовместимости vptr'ов и т.д..
со всеми виртуальностями нужно _очень_ сильно осторожничать и лучше вообще отказаться от них. а вообще непонятна проблема. ты писала access violаtion. значит у тебя там что-то не то: если ДЛЛ загрузился, то память не должна быть блокированна: это одна программа, один пользователь, одно виртуальное адресное пространство... может у тебя там с пользователями, или с правами пользователей проблемы ? и ещё ... каким образом существует нужда совмещения кода такого рода ? короче... если тебе не трудно наплевать немного примеров, будет проще думать. пока... |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Извените, может мне кто укажет, гдев СТАНДАРТЕ С++ описанно, как создаются таблицы виртуальных функций и стандартизированно ли это в принципе
-------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Нет, это никак не стандартизированно, но просто есть вещи, которые делать имеет смысл наиболее очевидным способом. Общепринятым. Как например реализация std::vector - вроде как во всех реализациях его итератор является простым указателем и само внутреннее представление исполненно в виде указателя. Это не стандартизированно, но многие девелоперы закаладываются но то, что это именно так, потому как по другому реализовывать это не умно. Добавлено @ 18:44 Опять же, Borland весьма заботился о том, чтобы COM технологии работали с ихними средами, а соотвественно им нет смысла уходить от стандартной реализации виртуальных таблиц (стандартизированно COM). Или, по крайней мере, у них должен быть способ указать, что этот интерфейс будет использован как COM интерфейс. -------------------- Волны гасят ветер... |
|||
|
||||
| Гость_serge |
|
|||
|
Unregistered |
Виртуальные таблицы в Delphi, C++Builder, Visual C++, g++ устрены по-разному.
Совместимость если есть - то только на уровне исходников. Для вызова функций из dll, написанной с помощью другого компилятора (за исключением вызова Delphi из C++Builder) нужно использовать чистый C или технологию COM, CORBA etc. |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Устроенны по разному, принцип вызова одинаков. В стек заталкивается указатель на класс, потом все остальные параметры, потом осуществляется вызов по адресу находящемуся по адресу указателя на класс плюс номер метода*4. Совместимость на уровне вызова.
А как, по-твоему, вызовы в СОМ осуществляются? -------------------- Волны гасят ветер... |
||||
|
|||||
| Гость_serge |
|
|||
|
Unregistered |
То что принцип одинаковый - никакой роли не играет, потому что детали не сопадают.
Указатель на вируальную таблицу может быть вставлен в другое место в классе, поля в классе могут быть выровнены по-разному, виртуальные функции могут быть вставлены в таблицу в другом порядке, имена функции декорируются(mangling) по-разному. Нестыковка может быть и между двумя версиями одного и того же компилятора. С технологией COM не работал, только иногда использовал готовые компоненты в C++ Builder, поэтому как она работает не знаю Здесь по-видимому выбрана C++Builder для dll потому что она написана для этого компилятора и исходники отсутствуют (но заголовки в любом случае нужны) В этом случае основной модуль лучше писать тоже на C++Builder (преимуществ Visual C++ в этом случае не вижу, если только не нужно использовать еще одну dll, написанную на Visual C++). Или же придется создавать dll-переходник(bridge) на C++Builder:
|
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Безусловно это так. Я про это уже тоже говорил - могут.
Как раз таки он очень большую роль и играет. Именно из-за него я могу вызывать виртуальные методы класса написанного на Делфи из VC. Смысл реализовавать виртуальные таблицы стандартно есть еще именно из-за COM. Вызовы интерфейсов - это обращения к виртуальным таблицам, и если делать их не стандартными, то придется еще специальные заморочки делать для написания СОM объектов. С CORBA, кстати, та же история. Я и с тем и с другим занимался на достадочно низком уровне, чтобы знать это. -------------------- Волны гасят ветер... |
||||
|
|||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 59 |
Воообще проблем никогда не существовало. Во всяком случае мпри использовании класса из dll, созданного VC и имортированного в Builder. Естественно елси соблюдабтся определенные правила
С++ Builder
VC++
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Спасибо, попытаюсь еще раз.
-------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |