Переопределение классов / функций из .dll - PullRequest
3 голосов
/ 05 апреля 2010

Скажем, у меня есть класс A и класс B. B наследуется от класса A и реализует несколько виртуальных функций. Единственная проблема заключается в том, что B определяется в .dll. Прямо сейчас у меня есть функция, которая возвращает экземпляр класса A, но она извлекает его из статической функции в .dll, которая возвращает экземпляр класса B. Я планирую вызвать созданный объект и, надеюсь, иметь функции в .dll, выполняемой вместо функций, определенных в классе А. По какой-то причине я продолжаю получать ошибки доступа к ограниченной памяти. Что-то, чего я не понимаю, помешает этому плану сработать?

Ответы [ 3 ]

1 голос
/ 06 апреля 2010

Смотрите мой другой обширный вопрос и ответ на эту тему - это помогает? Как работать (переносимо) с иерархиями классов C ++ и динамически связанными библиотеками

1 голос
/ 05 апреля 2010

C ++ классы плохо пересекают границы DLL. DLL и EXE должны быть собраны с одинаковыми компилятором и версией - желательно вместе. Это связано с тем, что особенности реализации класса, такие как vtbl макет / порядок, а также реализации некоторых стандартных функций библиотеки (т. Е. std::string различия) не являются переносимыми. Различные схемы компиляции имен компиляторов также не доступны между компиляторами / версиями. Единственный интерфейс, который вы можете надежно представить за пределами DLL, - это интерфейс C.

Поскольку я не знаю точного сценария здесь, я не уверен, но вы, вероятно, вызываете какой-то тип неопределенного поведения через границу DLL.

РЕДАКТИРОВАТЬ: также возможно, что DLL был выгружен в какой-то момент в результате вызова несуществующего кода в B.

0 голосов
/ 05 мая 2010

Вы пытались отладить его с помощью отладчика Visual Studio?

Настройте отладчик на перехват исключений win32, перейдя в меню «Отладка» -> «Исключения» и отметьте флажок рядом с Win32 exceptions в разделе Thrown
Теперь активируйте свой exe используя F5. Сбой должен предупредить отладчик, и вы сможете увидеть точное место нарушения прав доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...