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

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

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

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

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 15 апреля 2010

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

...