Компиляция стороннего obj-файла в 64-разрядное приложение Delphi — проблема с фреймами исключений

#delphi #module #64-bit #object-files

#delphi #модуль #64-разрядный #объектные файлы

Вопрос:

Я пытаюсь использовать сторонний объектный файл в моем 64-разрядном приложении Delphi, однако он просто выходит из строя.

Включая их mod64.obj , компиляции и ссылки в порядке, и функции в obj могут быть вызваны, но затем происходит сбой кода. mod64.obj Был собран с помощью MASM (v9)

Я поднял этот вопрос с сторонним разработчиком приложений, они загрузили версию сообщества Delphi для тестирования, и это их ответ:

Проблема, похоже, в том, что 64-разрядный компоновщик в Delphi не учитывает фреймы исключений, которые экспортирует объектный модуль, и навязывает свой собственный обработчик исключений. Это неправильно обрабатывает внутренне сгенерированные исключения в нашем модуле и приводит к сбою функции. Я пробовал это построение для отладки и без отладки и экспериментировал с такими параметрами компилятора и компоновщика, которые, казалось, могли бы иметь эффект, но безрезультатно, и теперь я застрял. Я вижу, что ни один из наших фреймов не попадает в раздел .pdata скомпилированного 64-разрядного исполняемого файла Delphi.

Итак, мой вопрос в том, существуют ли какие-либо настройки компилятора, необходимые для выполнения этой работы?

Комментарии:

1. Из моей собственной кодовой базы я также подозревал, что это происходит, но не знаю, как узнать, правильно ли объявлены фреймы исключений в объединенном исполняемом файле. Исключения во внешнем коде не всегда приводят к сбоям, но я сталкивался с ситуациями, когда исполняемый файл завершается без какого-либо сообщения об ошибке вообще. Это должно быть симптомом катастрофического сбоя механизма исключения. Я справился с этим, приложив все усилия, чтобы остановить возникновение исключений во внешнем коде. Что-то, что может быть достигнуто в моем сценарии, но не всегда возможно.

2. Я думаю, что единственное реалистичное решение для вас — скомпилировать external .obj в DLL и связать с этим. Я бы также подумал о том, чтобы сообщить об этой проблеме в QP.

3. Конечно, это не соблюдает их! Исключения на разных языках абсолютно несовместимы. Исключения никогда не должны экспортироваться из объектных файлов для использования на других языках, отличных от того же самого. Я вижу, что Дэвид уже имел «удовольствие» иметь дело с таким кодом. Вы действительно могли бы превратить его в DLL, но убедитесь, что из DLL не выходит ни одно исключение. В любом случае, привязку к объектам C (а исключениями обычно являются объекты на C ) лучше всего выполнять, как в моей статье, используя объекты C в Delphi .

4. Руди — это 64-разрядная вещь или 32-разрядная тоже? Я спрашиваю, поскольку 32-разрядная версия obj отлично работает с 32-разрядным delphi (и работает уже много лет).

5. @David это проблема x64 из-за разных моделей обработки исключений. исключения x64 основаны на таблицах, в x86 они основаны на стеке. Из комментария Руди ясно, что он на самом деле не понимает проблемы здесь.