DLL создаёт потоки. В потоке происходит AV. Дефолтный виндовый хэндлер убивает всё приложение
Несовместимо с моей парадигмой "Если есть что сохранять, то при крахе должно сработать автосохранение".
Устанавливать обработчик в DLL? Можно было бы. НО. Это что пнём об сову, что совой об пень: этот обработчик должен уметь распознать исключения в EXE и перенаправить туда.
Обработчик-то единый на процесс, на все исполняемые модули и все потоки.
Добавлено спустя 6 часов 7 минут 55 секунд:
Оооо-кей, нашёл один нежданчик в стиле "самдурак". Кучу запарывало только так.
Задачка для любознательных: какое безбожное святотатство содержится в этом фрагменте, и в какой строчке?
- Код: Выделить всё
//function unzGetCurrentFileInfo(afile: unzFile; pfile_info: unz_file_info_ptr; szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint; szComment: PChar; commentBufferSize: longint): longint; { ZEXPORT }
function TUnzip.GetCurrentFileInfo(pfile_info: unz_file_info_ptr; var FileName: AnsiString; extraField: pointer; extraFieldBufferSize: longint; var Comment: AnsiString): boolean; { ZEXPORT }
{ Get Info about the current file
if pfile_info<>NIL, the pfile_info^ structure will contain somes
info about the current file
if szFileName<>NIL, the filemane string will be copied in szFileName
(fileNameBufferSize is the size of the buffer)
if extraField<>NIL, the extra field information will be copied in
extraField (extraFieldBufferSize is the size of the buffer).
This is the Central-header version of the extra field
if szComment<>NIL, the comment string of the file will be copied in
szComment (commentBufferSize is the size of the buffer) }
var name_sz, comm_sz: longint;
begin
//function TUnzip.GetCurrentFileInfoInternal(pfile_info: unz_file_info_ptr; pfile_info_internal: unz_file_info_internal_ptr;
// szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint;
// szComment: PChar; commentBufferSize: longint): longint;
// unzGetCurrentFileInfo := unzlocal_GetCurrentFileInfoInternal(afile,
// pfile_info, nil, szFileName, fileNameBufferSize,
// extraField, extraFieldBufferSize,
// szComment, commentBufferSize);
SetLength(FileName, UNZ_MAXFILENAMEINZIP + 1);
SetLength(Comment, 1000);
Result:= UNZ_OK = GetCurrentFileInfoInternal(
pfile_info, nil,
@FileName[1], Length(FileName),
extraField, extraFieldBufferSize,
@Comment, Length(Comment)
);
CutAnsiStringByZeroChar(FileName);
CutAnsiStringByZeroChar(Comment);
end;
Добавлено спустя 12 часов 44 минуты 45 секунд:
Пока ехал в метро на работу, добавил отладочный режим где потоки не создаются, а все фоновые задачи выполняются в основном потоке.
Падать перестало.
Раздражает.
Добавлено спустя 7 часов 35 минут 50 секунд:
P.S. Моё отношение к изменениям механизма строк в грядущем fpc 3:
Я очень рад что они наконец-то это сделали, и обязательно сделаю свой движок 100% юникодным (о чём давно мечтал). Но доползу далеко не сразу. Частичная переделка вялотечёт уже давно, но сделать ещё предстоит немало, и - буду честен - для меня сейчас гораздо важнее получить рабочий игровой мир где уже бегают монстры и плещутся волны. Так что, скорее всего, и Чентра и Чеперси до конца 2015-го застрянут на связке FPC 2.6.4 / внутренняя кодировка = WideString.