direktorSan
Удачи!
Участник
Offline
Пол:
|
|
« : 08-10-2005 12:41 » |
|
Здравствуйте.
Помогите, пожалуйста, решить одну проблему.
Есть написанный в C++ Builder-e проект.
Есть написанная в MS Visual C++ DLL. Библиотека написана без использования MFC. (Были причины писать в разных средах.)
Библиотека подключается в проекте явно с помощью LoadLibrary. В ходе работы проекта из функции prjAddShell вызывается библиотечная функция libAddShell динамического (с использованием new) создания объектов самопального класса TShell, которые содержат потоки.
Указатели TShell* на созданные объекты передаются в проект под типом PVOID. Эти переданные указатели в проекте просто хранятся в списке объектов, т.е. никаких действий с ними не производится.
Далее из проекта из другой функции prjShellDirection вызывается очередная библиотечная функция libShellDirection управления объектами, одним из аргументов которой является указатель типа PVOID на один из объектов. В этой библиотечной функции libShellDirection происходит приведение типа PVOID к типу указателя на класс: TShell* shPtr = static_cast<TShell*>(Arg), после чего производятся некоторые действия с объектом (в т.ч., но необязательно, и его удаление вызовом delete).
В пределах функции libShellDirection все работает нормально. И возврат из этой функции в функцию prjShellDirection проета тоже происходит без проблем. Но как только происходит выход из функции libShellDirection проекта возникает ошибка: "Access violation at address 00000009. Write of address 020C0D15." либо "Access violation at address 011835D7. Read of address FFFFFFFF."
Сперва я грешил на new/delete, т.е. на работу с памятью. Версия не подтвердилась. Затем я просто убрал из передаваемых параметров указатель и ошибки исчезли (а функциональность, естественно, пострадала). Также было замечено, что если все вызовы библиотечных функций делать из одной функции проекта, то ошибок не возникает (но функциональность страдает не меньше).
Кто-нибудь знает в чем может быть причина?
|