Поэтому я играл с символами и широкими символами в основной программе, которая рекурсивно сканирует каталоги в Windows. Первоначально я использовал стандартные символы и строки, а также некоторые связанные функции для выполнения этой задачи (FindFirstFile, FindNextFile и т. Д.). Фактическая рекурсия передается созданному потоку через CreateThread и WaitForSingleObject; который работал совершенно нормально и, как и ожидалось.
Однако возникла проблема, когда я преобразовал эти символы, строки и связанные с ними функции в их широкие аналоги (wchar_t, wstring, FindFirstFileW и т. Д.). Теперь программа выдает исключение при рекурсивном сканировании каталогов с более чем небольшим количеством папок / файлы. Исключение происходит во время фазы WaitForSingleObject обработки моего потока. я имею выследил следующую информацию на самом исключении:
EAccessViolation класс исключений для недопустимого доступа к памяти
ошибки.EAccessViolation возникает, когда приложение:
Разыменовывает указатель nil (Delphi) или NULL (C ++).
Записывает в память, зарезервированную для исполняемого кода.
Попытки получить доступ к адресу памяти, для которого нет виртуального
память, выделенная для приложения.Информация об исключительной ситуации во время выполнения сохраняется в полях, предоставленных
EExternal.Примечание: приложения не должны вызывать EAccessViolation
напрямую, но вместо этого следует полагаться на время выполнения, чтобы поднять это
исключение.
Мой вопрос: с какой стати это исключение выдается, когда единственное, что я изменил, это тип используемых символов? Я использую IDE RAD Studio XE3 C ++ Builder, и, к сожалению, я не могу действительно протестировать это в одной из моих других IDE без внесения существенных изменений в код.
Задача ещё не решена.
Других решений пока нет …