2010-04-05 3 views
3

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

+0

Связанный [stackoverflow] (http://stackoverflow.com/questions/220515/how-to-intercept-dll-method-calls) вопрос –

+1

Просьба предоставить весь ваш код (или минимальный фасад, который проявляет такое же проблемное поведение). – conio

+0

Трудность использования классов через границы DLL является частью причины, по которой люди все еще используют (содрогаются) COM. – Qwertie

ответ

1

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

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

EDIT: Это также возможно, что DLL был выгружен в какой-то момент в результате на вызов несуществующего кода в B.

+0

Я сам компилирую .dll, я также пытаюсь избежать схем смены имени, убедившись, что функции объявлены как c-функции. – Jeff

+0

Похоже, проблема связана не с вызовом виртуальной функции. Если вы разместите какой-то код, мы сможем дать лучший ответ. –

+0

Я думаю, что вызов функции не является проблемой, я обнаружил, что ошибка возникает, когда я пытаюсь создать экземпляр указателя, который является членом класса B в рамках одной из виртуальных функций. – Jeff

0

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

Установите отладчик, чтобы поймать исключения win32, перейдя отладить меню-> Исключения и установите флажок рядом с Win32 exceptions под Thrown
Теперь активировать ех с помощью F5. Авария должна предупредить об отладчике, и вы должны увидеть точное местоположение нарушения доступа.

+0

Да, и, возможно, выполните разборку для получения дополнительных сведений. – Qwertie