Нарушение прав доступа при запуске собственного приложения C++, использующего встроенную DLL /clr.

StackOverflow https://stackoverflow.com/questions/2645961

  •  27-09-2019
  •  | 
  •  

Вопрос

Я реорганизую устаревшее смешанное приложение (управляемые и неуправляемые библиотеки DLL) так, чтобы основной сегмент приложения был неуправляемым MFC и вызывал C++ DLL, скомпилированную с флагом /clr, который будет связывать управляемый (C# DLL) и неуправляемый код. .К сожалению, мои изменения привели к нарушению прав доступа, которое происходит до вызова приложения InitInstance().Это очень затрудняет отладку.Единственная информация, которую я получаю, — это следующая трассировка стека.

>   64006108()  
ntdll.dll!_ZwCreateMutant@16()  + 0xc bytes 
kernel32.dll!_CreateMutexW@12()  + 0x7a bytes   

Итак, вот несколько сценариев, которые я попробовал.
— Включены «Исключения» -> «Исключения Win32» -> «c0000005 Нарушение прав доступа» для прерывания при возникновении.Тем не менее, наиболее подробную информацию я получаю из приведенной выше трассировки стека.Я пробовал приложение с помощью F10, но оно терпит неудачу до того, как будут достигнуты какие-либо точки останова, и завершается с ошибкой с приведенной выше трассировкой стека.

- Я удалил DLL моста, чтобы у нее был только один метод, возвращающий логическое значение, и этот метод закодирован так, чтобы просто возвращать false (код C# не вызывается).

bool DllPassthrough::IsFailed() { return false; }

Если заглушка DLL скомпилирована с флагом /clr, приложение завершится сбоем.Если оно скомпилировано без флага /clr, приложение запускается.

- Я создал приложение-заглушку MFC с помощью мастера Visual Studio для многодокументных приложений и вызвал DllPassthrough::IsFailed().Это удается даже с флагом /clr, используемым для компиляции DLL.

- Я попробовал выполнить загрузку библиотеки winmm.lib вручную, как описано в следующей заметке. Нарушение прав доступа при использовании C++/cli.Приложение по-прежнему не работает.

Итак, мои вопросы: как решить проблему?Любые намеки, стратегии или предыдущие инциденты.И если это не удастся, как я могу получить дополнительную информацию о том, какой сегмент кода или библиотека вызывает исключение доступа?Если я попробую более сложные обходные пути, такие как вызовы LoadLibrary, я бы хотел сузить их до неисправных библиотек.

Спасибо.Кстати, мы используем Visual Studio 2008, а проект строится на базе .NET 2.0 для управляемых разделов.

Это было полезно?

Решение

Я верю, что решу свою проблему.Систематически удаляя каждую ссылку на библиотеку и комментируя вызовы в эту конкретную библиотеку в коде приложения (неуправляем), я в конечном итоге удалил библиотеку проблем и получил программу для запуска.Это грубый способ диагностики проблемы, и, к счастью, мне не пришлось удалять слишком много библиотек, чтобы решить ее.Мне все равно было бы любопытно, есть ли у кого-нибудь комментарий, можно ли было идентифицировать библиотеку с помощью отладчика.
Итак, следующим шагом будет перемещение этих вызовов библиотеки в управляемый код и передача информации обратно неуправляемой стороне через мою мостовую DLL.Кстати, я реинтегрировал winmm.lib в проект, и он все еще работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top