У меня есть код, который отлично работал под Delphi 2007, но ломается под D2010. Он включает передачу строки, преобразование ее в PWideChar (в частности, указатель WideString, а не указатель UnicodeString), выполнение некоторой обработки, а затем вызов SysFreeString на нем. Он отлично работает до тех пор, пока не будет пропущена пустая строка, а затем разрывается SysFreeString. Он называет кучу вещей, которые в конечном итоге поднимают точку останова Int 3
внутри NTDLL.DLL. Продолжая мимо этой точки приводит кЧто может заставить SysFreeString попасть в точку останова Int 3?
проекта поднял класс исключение $ C0000005 с сообщением "Нарушение прав доступа на 0x7747206e: чтение из адреса 0x539b8dba.
Который, если вы внимательно присмотритесь, не является стандартным сообщением о нарушении прав доступа.
В верхней части трассировки стека, когда он попадает в Int 3
выглядит следующим образом:
:774e475d ; ntdll.dll
:774afad0 ; ntdll.dll
:774e5de9 ; ntdll.dll
:774a6dff ; ntdll.dll
:76fc1075 ; C:\Windows\system32\ole32.dll
:770e443a ; C:\Windows\system32\oleaut32.dll
:770e3ea3 oleaut32.SysFreeString + 0x4a
Кто-нибудь есть какие-либо идеи, что здесь происходит?
Редактировать (с комментариями):
Это не WideString, хотя. Это PWideChar порождена StringToOleStr, и нет двойных свободных ошибок при непустой строки передаются. К сожалению, я действительно не могу опубликовать образец кода , потому что это третья сторона компонент, который находится под защитой авторских прав. (И я не могу просить у них поддержки, потому что это больше не поддерживается. В основном, один большой беспорядок все дело в.)
Это не WideString. Это PWideChar, сгенерированный StringToOleStr, и нет никаких двойных ошибок при передаче непустой строки. К сожалению, я не могу опубликовать образец кода, потому что это сторонний компонент, который находится под защитой авторских прав. (И я не могу попросить их о поддержке, потому что она больше не поддерживается. В принципе, все это один большой беспорядок.) –
Тогда вам действительно нужно показать фрагмент кода, который показывает проблему в действии. Если вы не можете показать код компонента, пожалуйста, укажите отдельный пример, который воспроизводит тот же сбой. –