![]() |
|
|
![]()
|
|
| stmamont |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
У меня программа, она подключает Dll во время выполнения.
В программе есть класс
В Dll
То при вызове insert у меня генериться Access Violation в стандартном файле _tree.h Вот на этом коде
Здесь я посмотрел _M_data указывает не на NULL В чем же проблема? Я пол дня с этим бъюсь и не могу понять в чем же дело Если вместо BList.insert написать BList.size() то все правильно сработает, вернется ноль Если Вызвать BList.insert в программе до вызова DllConstructor, то все пройдет нормально. Подскажите пожалуйста!!! |
||||||
|
|||||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
Забыл сказать причем тут наследование
В Dll вместо NULL изначально писался указатель на объект типа class C: public B; Когда ввел в окно Evaluate/Modify *this->_M_header._M_data->_M_parent В функции _Link_type& _M_root() const Evaluate/Modify написало ошибку
Это сообщение отредактировал(а) stmamont - 16.8.2006, 08:43 |
|||
|
||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Сразу вижу несоответсвия.
1.Для класса А указали , что он экспортируется из dll, но не указали, что импортируется в exe 2. Почему _cdecl ? Насколько я помню, это модификатор использования С-стиль преобразования имен. Обычно использует примерно такого вида метод export_api.h
classA.h
И соответственно для exe
для dll
-------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| stmamont |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
на самом деле __declspec а не __cdecl это я опечатался.
Попробовал сделать как написали, та же ошибка, с единственным исключением написал: В Dll
В exe
Совсем не понял почему мы подключаем и к exe и к dll один и тот же заголовок class a!?? Пробовал передать std::map в DllConstructor как указатель, та же ошибка. Почему то STL неадекватно ищет _M_root()??? В чем же дело, я уже себе мозги свернул об это... Это сообщение отредактировал(а) stmamont - 16.8.2006, 10:50 |
||||
|
|||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Обычно именно так и делают. Подключают один и тот же заголовок и к dll и exe. Это делается , чтобы исключить возможные ошибки при внесении изменений
Блин, а это что за ерунда?
ОБЪЯВЛЕНИЯ ДОЛЖНЫ БЫТЬ ИДЕНТИЧНЫ, Именно по этому обычно и используется один хедер. Должно быть вот так
Добавлено @ 13:13 С чего Вы взяли, что декларация метода в варианте импорта измениться на указатетель функции? Причем на не на указатель на метод класса, а на указатель на свободную функцию. -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
Я хотел просто потом в exe файле присвоить указателю функции адрес который вернет getprocadress из dll
Взял это с: http://citforum.ru/book/cook/dll0.shtml Можно какую нибудь статью или маленький примерчик, как организовать класс, метод которого берется из динамически подключаемой библиотеки а а все остальное задано в начале программы? |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Понятно. Непонятно одно. Зачем тебе потребовалась явная загрузка dll при условии экспорта классов ?
Почему просто не воспользоваться статической компоновкой той же dll. Или обязательно хочется загрузить dll ручками? Теперь так. Вся проблема в том, что в примере по ссылке метод Demo не обращается к членам класса
И у меня большое подозрение в том, что это вообще будет работать. Проверять лень. Попробуй объявление в exe сделать вот так
Ну и вызов
Дело в том, что в методе класса в качестве неявного параметра первым передается указатель на объект. И если вызывать метод класса как свободную функцию(а это мы как раз и делаем), то ей надо передать этот this. А вообще такой подход, больше похож на мышиную возню. Вместо экспорта класса экспортируем его методы как свободные функции. -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
||||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Если уж очень хочется грузить dll ручками и работать с импортом классов, то надо поступать иначе
dll
exe
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |