Нарушения доступа в странных местах при использовании файловых диалогов Windows - PullRequest
1 голос
/ 18 марта 2010

Давным-давно я обнаружил, что я получаю нарушения прав доступа в своем коде из-за использования диалогов Delphi Open File и / или Save File, которые инкапсулируют диалоги Windows. Я задал несколько вопросов на нескольких форумах, и мне сказали, что это может быть связано с тем, что некоторые программы добавляют хуки в систему оболочки, что приводит к внедрению DLL в каждый процесс, некоторые из которых могут вызвать хаос в программе. Для справки, среда программирования, которую я использую, - это Delphi 6 Professional, работающая на 32-битной Windows XP.

В то время я обошел это, не используя компоненты Dialog Delphi и вместо этого вызывая прямо в comdlg32.dll. Это решило проблему чудесно.

Сегодня я впервые работал с отображенными в память файлами, и, конечно же, нарушения прав доступа начали появляться в странных частях кода. Я попробовал мои прямые звонки comdlg32.dll, и на этот раз это не помогло. Чтобы выделить проблему как тест, я создал список со списком тех же файлов, которые я использовал во время тестирования. Это те же самые тестовые файлы, которые я выбирал в диалоговом окне «Открыть файл», а затем запускал файл, отображенный в памяти. Я настроил все так, чтобы, щелкая файл в списке, я использовал этот файл в своем тесте сопоставленного файла памяти вместо вызова диалоговой функции comdlg32.dll для выбора тестового файла.

Опять нарушители доступа исчезли. Чтобы показать вам, насколько драматичным было исправление, я перешел от нарушения доступа в течение 1-3 испытаний ни к одному. К сожалению, это укусит меня позже, конечно, когда мне нужно будет использовать файловые диалоги.

Кто-нибудь еще занимался этим вопросом и нашел настоящего преступника? Кто-нибудь из вас нашел решение, которое я мог бы использовать, чтобы решить эту проблему, вместо того, чтобы танцевать вокруг него, как сейчас?

Заранее спасибо.

1 Ответ

5 голосов
/ 18 марта 2010

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

Более вероятно, что неиспользование компонентов имело побочный эффект в вашем коде, который запутывал или маскировал основную проблему, уменьшая ее до такой степени, что она, казалось, была решена.

Я подозреваю, что и здесь тоже так.

Я не знаю, какие расширения оболочки hokey вы установили в своей системе - возможно, у вас есть какое-то странное расширение, которое вызывает некоторые проблемы. Все, что я могу сказать, это то, что за 15 с лишним лет программирования на Win32 с Delphi я никогда не знал или даже не слышал о компонентах диалога общих файлов Delphi, ответственных за такое поведение.

Конечно, простой способ проверить это - взять скомпилированный EXE-файл, который обнаруживает нарушения прав доступа на вашем компьютере, и запустить тот же EXE-файл на каком-либо другом компьютере XP с "чистой комнатой", то есть без сторонних расширений оболочки. установил что-нибудь-когда-либо.

Если AV исчезает, вы можете быть более уверены, что проблема как-то связана с расширением оболочки. Затем, установив известные расширения оболочки на тестовом компьютере один за другим, пока AV не появится снова, вы можете изолировать виновника и решить, что с этим делать ... если это то, что ваши пользователи / клиенты вряд ли будут используя затем, вы можете просто перечислить ее как известную проблему совместимости и перейти к другим проблемам.

Однако, если AV не исчезают, тогда вы можете в значительной степени исключить диалоги Delphi или любые расширения оболочки, так как они вообще как-то ответственны.

В целом, было бы наиболее полезно увидеть код, в котором происходит AV, если это вообще возможно.

Добавление:

Я нашел эту ссылку на AV, возникающую с самими компонентами Common Dialog . Это, однако, не будет считаться «странным местом» для AV, будучи последовательно воспроизводимым - кажется - в самих компонентах диалога. Но я думал, что упомяну об этом в любом случае. Не зная точно, где находятся ваши AV, возможно, это может быть связано.

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