C ++ - ссылка на стороннюю DLL - нарушение прерывистого доступа - PullRequest
1 голос
/ 24 июня 2009

Мне предоставили C ++ DLL и связанный с ним заголовочный файл, чтобы интегрировать его с моим приложением. Для начала я просто пытаюсь вызвать DLL из простого консольного приложения Win32 (я использую Visual Studio 2008 Express).

Я связал DLL, указав ее в качестве дополнительной зависимости в настройках проекта.

Интерфейс (т.е. единственная экспортируемая функция) просто возвращает указатель на экземпляр класса, который мне действительно нужно вызвать. Я могу успешно вызвать это, получить указатель и вызвать первую функцию, которая мне нужна (функция "init").

Когда я вызываю функцию, которая фактически выполняет необходимую мне обработку, я периодически получаю сообщение об ошибке «0xC0000005: Место чтения нарушения доступа ....». То есть я запускаю программу - она ​​успешно работает и выходит - я пытаюсь запустить ее снова (ничего не меняя - все параметры жестко запрограммированы) и получаю сообщение об ошибке (и продолжаю делать это).

Я не могу последовательно воссоздать проблему, но я начинаю думать, что это может быть связано с тем, что DLL не выгружается должным образом - после получения ошибки однажды я попытался удалить DLL, и Windows сообщила что это было в использовании. Тем не менее, в другой раз я смог удалить DLL после получения ошибки, скопировать ее обратно, но все равно получил ошибку при следующем запуске.

Должна ли DLL правильно выгружаться после завершения работы моего .exe? Будет ли лучше попытаться явно загрузить / выгрузить DLL, а не делать это неявным образом?

Любая другая помощь или совет с благодарностью.

Ответы [ 3 ]

1 голос
/ 24 июня 2009

Каковы ваши настройки для "Runtime library" в разделе "C / C ++" в свойствах конфигурации?
Возможно, вам следует попробовать / MD (или / MDd для отладки).
см http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx

1 голос
/ 24 июня 2009

Это не имеет ничего общего с выгружаемой DLL; разные процессы, использующие одну и ту же DLL, не имеют общего состояния. Кроме того, DLL будет выгружена при выходе из процесса; возможно, не изящно, но он будет выгружен.

Я могу вспомнить две вероятные причины прерывистого отказа.

Скорее всего, DLL имеет состояние гонки. Это может быть тот, который выставлен, если DLL была кэширована, вызывая изменение времени. Это объяснило бы, почему ваш первый запуск не провалился, а последующие -. 1005

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

Кроме того, получите это в отладчике. Включите исключения для первого случая в Visual Studio, посмотрите на стек вызовов, где происходит AV, и опубликуйте его здесь.

1 голос
/ 24 июня 2009

Какие типы участвуют в классах, экспортируемых из DLL? У нас часто возникали подобные проблемы с Visual Studio, когда классы используют STL - я предполагаю, что любое использование шаблона, вероятно, будет способом потенциально вызвать такого рода проблемы.

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