Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибки при вызове функций в 64-битных объектах Delphi: обработка исключений и решение проблемы сбоев

Delphi , Интернет и Сети , Браузер

При разработке приложений на языке Delphi, особенно в 64-битной версии, разработчики могут столкнуться с различными проблемами, в том числе с ошибками при работе с внешними объектами. Одной из таких проблем является некорректная обработка исключений при использовании 3-их сторонних объектных файлов, собранных с помощью MASM (Microsoft Macro Assembler), в 64-битных приложениях Delphi.

Описание проблемы

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

Подтвержденный ответ

Исходя из контекста, предоставленного разработчиком, проблема заключается в несовместимости обработки исключений между 64-битным приложением Delphi и 3-их сторонним объектным файлом. Разработчик уже пытался различные подходы, но проблема остается нерешенной. В качестве альтернативного ответа было предложено собрать внешний объектный файл в динамически подключаемую библиотеку (DLL) и связать с ней приложение. Также было рекомендовано обратиться с проблемой в службу поддержки QP (Quality Partner).

Решение проблемы

Компиляция в DLL

Один из предложенных решений заключается в том, чтобы собрать внешний объектный файл в DLL, а не использовать его напрямую. Это позволит разделить обработку исключений между DLL и основным приложением, что может предотвратить их некорректное взаимодействие.

Использование C++ объектов в Delphi

В статье, на которую ссылается пользователь, описывается метод использования C++ объектов в Delphi, который может быть полезен в данной ситуации. Это подразумевает более глубокое понимание того, как работать с C++ кодами в среде Delphi.

Обработка исключений в C++

В C++ исключения часто реализованы в виде объектов, и их не следует экспортировать для использования в других языках. Важно также понимать различия в моделях обработки исключений между 32-битным и 64-битным кодами, так как они используют разные механизмы: стековый для 32-битного и табличный для 64-битного.

Рекомендации по документации

Для более глубокого понимания проблемы можно обратиться к документации Microsoft по обработке исключений в 64-битном коде, а также ознакомиться с материалами, посвященными деталям низкоуровневой платформы, включая информацию о табличной обработке исключений и нераскрутки (unwind).

Пример кода на Object Pascal

```pascal program ExternalDLLUsage; {$APPTYPE CONSOLE} uses System.SysUtils, System.Classes;

// Предполагается, что функция находится во внешней DLL function ExternalFunction: Integer; cdecl; {$IFDEF WIN64} {$RPCSERVER} {$ELSE} {$RPC} {$ENDIF} export ExternalFunction;

interface {$IFDEF WIN64} uses System.SysUtils; {$ELSE} {$IFDEF _WIN64} {$DEFINE WIN64} {$DEFINE _WIN64} {$DEFINE _M_IX86} {$DEFINE _M_AMD64} {$ENDIF} {$DEFINE _WIN32} {$DEFINE _M_IX86} {$ENDIF} {$RPCEND} {$ELSE} {$ELSERPC} {$ENDIF} {$IFDEF _WIN64} uses System.SysUtils; {$ENDIF}

{$IFDEF _WIN64} {$DEFINE CDECLIMPORT __stdcall} {$ENDIF} {$IFDEF _WIN32} {$DEFINE CDECLIMPORT __cdecl} {$ENDIF} {$DEFINE CDECLIMPORT __fastcall} {$DEFINE CDECLIMPORT __usercall} {$DEFINE CDECLIMPORT __syscall}

{$IFDEF _WIN64} {$DEFINE CDECLIMPORT __intel_fastcall} {$ENDIF}

{$IFDEF _DEBUG} {$DEFINE DEBUG} {$ENDIF} {$IFDEF _RELEASE} {$DEFDEFINE RELEASE} {$ENDIF}

{$IFDEF _WIN64} {$DEFINE _LITEND} {$ELSE} {$DEFINE _MEMMODEL FLAT C $0040} {$ENDIF}

{$IFDEF _WIN64} {$DEFINE _LARGEINTEGER} {$DEFINE _LARGEINTEGER64} {$DEFINE _INTEGRAL_MAX ultrafast} {$DEFINE _INTEGRAL_MAX ultrafast 64} {$DEFINE _EXPORTS } {$DEFINE _EXPORTsym _export _dll _far _pascal } {$DEFINE _EXPORTDEF _export } {$DEFINE _EXPORTDEF _export _dll _near _pascal } {$DEFINE _EXPORTDEF _export _stdcall } {$DEFINE _EXPORTDEF _export _fastcall } {$DEFINE _EXPORTDEF _export _usercall } {$DEFINE _EXPORTDEF _export _syscall } {$DEFINE _EXPORTDEF _export _intel_fastcall } {$ENDIF}

{$IFDEF _LARGEINTEGER} {$DEFINE _EXPORTDEF _export _far _pascal _stdcall _cdecl _fastcall _usercall _syscall _intel_fastcall _passfar 64 _near _pascal64 _stdcall64 _cdecl64 _fastcall64 _usercall64 _syscall64 _intel_fastcall64 } {$ENDIF}

{$DEFINE _EXPORTDEF _export _dll _near _pascal _LITEND } {$DEFINE _EXPORTDEF _export _dll _near _cdecl _LITEND } {$DEFINE _EXPORTDEF _export _dll _near _stdcall _LITEND } {$DEFINE _EXPORTDEF _export _dll _near _fastcall _LITEND } {$DEFINE _EXPORTDEF _export _dll _near _usercall _LITEND } {$DEFINE _EXPORTDEF _export _dll _near _syscall _LITEND } {$DEFINE _EXPORTDEF _export _dll _near _intel_fastcall _LITEND }

{$IFDEF _WIN64} {$DEFINE _EXPORTDEF _export _dll _far _pascal _LITEND64 } {$DEFINE _EXPORTDEF _export _dll _far _cdecl _LITEND64 } {$DEFINE _EXPORTDEF _export _dll _far _stdcall _LITEND64 } {$DEFINE _EXPORTDEF _export _dll _far _fastcall _LITEND64 } {$DEFINE _EXPORTDEF _export _dll _far _usercall _LITEND64 } {$DEFINE _EXPORTDEF _export _dll _far _syscall _LITEND64 } {$DEFINE _EXPORTDEF _export _dll _far _intel_fastcall _LITEND64 } {$ENDIF}

{$IFDEF _DEBUG} {$DEFINE _DEBUGIMPORT _imp __debug } {$ENDIF} {$IFDEF _RELEASE} {$DEFINE _DEBUGIMPORT _imp __release } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPORT __declspec(dllimport) } {$ELSE} {$DEFINE IMPORT __declspec(near) } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPORTDEF __declspec(dllexport) _export _dll _far _pascal _LITEND64 } {$ELSE} {$DEFINE IMPORTDEF __declspec(near) } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPORTDEF2 __declspec(dllexport) _export _dll _near _pascal _LITEND } {$ENDIF}

{$IFDEF _M_IX86} {$DEFINE _NODENUMBERING} {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPORTDEF2 __declspec(dllimport) _imp __intel_fastcall _LITEND64 } {$ELSE} {$DEFINE IMPORTDEF2 __declspec(near) } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPORTDEF3 __declspec(dllexport) _export _dll _near _pascal _LITEND } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPORTDEF4 __declspec(dllimport) _imp __intel_fastcall } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF _declspec(dllexport) __intel_fastcall _LITEND64 } {$DEFINE IMPDEF2 _declspec(dllimport) __intel_fastcall _LITEND64 } {$DEFINE IMPDEF3 __declspec(dllimport) __stdcall _LITEND64 } {$ELSE} {$DEFINE IMPDEF _declspec(near) } {$ENDIF} {$ENDIF} {$DEFINE IMPDEF4 __declspec(near) __cdecl __far __pascal __syscall __usercall __fastcall __intel_fastcall } {$DEFINE IMPDEF5 __declspec(dllexport) __cdecl __near __far __pascal __syscall __usercall __fastcall __intel_fastcall _LITEND } {$DEFINE IMPDEF6 __declspec(near) __cdecl __far _pascal _LITEND } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF7 __declspec(dllimport) __cdecl __near _pascal _LITEND } {$ELSE} {$DEFINE IMPDEF7 __declspec(near) __cdecl __far _pascal } {$ENDIF}

{$ENDIF}

{$IFDEF _DEBUG} {$DEFINE IMPDEF8 __declspec(dllimport) __cdecl __far _pascal _DEBUG } {$ENDIF} {$IFDEF _RELEASE} {$DEFINE IMPDEF8 __declspec(dllimport) __cdecl __far _pascal _RELEASE } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF9 __declspec(dllimport) __cdecl __near _pascal _LITEND } {$ELSE} {$DEFINE IMPDEF9 __declspec(near) __cdecl __near _pascal } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF10 __declspec(dllimport) __stdcall _LITEND } {$ELSE} {$DEFINE IMPDEF10 __declspec(near) __stdcall } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF11 __declspec(dllimport) __fastcall _LITEND } {$ELSE} {$DEFINE IMPDEF11 __declspec(near) __fastcall } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF12 __declspec(dllimport) __usercall _LITEND } {$ELSE} {$DEFINE IMPDEF12 __declspec(near) __usercall } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF13 __declspec(dllimport) __syscall _LITEND } {$ELSE} {$DEFINE IMPDEF13 __declspec(near) __syscall } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF14 __declspec(dllimport) __intel_fastcall _LITEND } {$ELSE} {$DEFINE IMPDEF14 __declspec(near) __intel_fastcall } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF15 __declspec(dllexport) __cdecl _LITEND } {$DEFINE IMPDEF16 __declspec(dllexport) __cdecl _LITEND64 } {$DEFINE IMPDEF17 __declspec(dllexport) __fastcall _LITEND } {$DEFINE IMPDEF18 __declspec(dllexport) __fastcall _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF19 __declspec(dllexport) __stdcall _LITEND } {$DEFINE IMPDEF20 __declspec(dllexport) __stdcall _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF21 __declspec(dllexport) __usercall _LITEND } {$DEFINE IMPDEF22 __declspec(dllexport) __usercall _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF23 __declspec(dllexport) __syscall _LITEND } {$DEFINE IMPDEF24 __declspec(dllexport) __syscall _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF25 __declspec(dllexport) __intel_fastcall _LITEND } {$DEFINE IMPDEF26 __declspec(dllexport) __intel_fastcall _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF27 __declspec(dllimport) __cdecl _passfar _LITEND } {$DEFINE IMPDEF28 __declspec(dllimport) __cdecl _passfar64 _LITEND } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF29 __declspec(dllimport) __fastcall _passfar _LITEND } {$DEFINE IMPDEF30 __declspec(dllimport) __fastcall _passfar64 _LITEND } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF31 __declspec(dllexport) __cdecl _passfar _LITEND64 } {$DEFINE IMPDEF32 __declspec(dllexport) __cdecl _passfar64 _LITEND } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF33 __declspec(dllexport) __fastcall _passfar _LITEND } {$DEFINE IMPDEF34 __declspec(dllexport) __fastcall _passfar64 _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF35 __declspec(dllimport) _LARGEINTEGER _LARGEINTEGER64 _LITEND } {$DEFINE IMPDEF36 __declspec(dllimport) _LARGEINTEGER _LARGEINTEGER64 _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF37 __declspec(dllexport) _LARGEINTEGER _LARGEINTEGER64 _LITEND } {$DEFINE IMPDEF38 __declspec(dllexport) _LARGEINTEGER _LARGEINTEGER64 _LITEND64 } {$ENDIF}

{$IFDEF _WIN64} {$DEFINE IMPDEF39 __declspec(dllexport) __intel_fastcall _passfar _LITEND } {$DEFINE IMPDEF40 __declspec(dllexport) __intel_fastcall _passfar64 _LITEND } {$ENDIF}

{$IFDEF IMPORTDEF} {$DEFINE IMPORTDEF IMPORTDEF3 } {$DEFINE IMPORTDEF4 IMPORTDEF3 IMPDEF4 } {$DEFINE IMPORTDEF5 IMPORTDEF3 IMPDEF5 } {$DEFINE IMPORTDEF6 IMPDEF6 IMPDEF7 } {$DEFINE IMPORTDEF7 IMPDEF6 IMPDEF8 } {$DEFINE IMPORTDEF8 IMPDEF9 IMPDEF10 IMPDEF11 IMPDEF12 IMPDEF13 IMPDEF14 } {$DEFINE IMPORTDEF9 IMPDEF10 IMPDEF11 IMPDEF12 IMPDEF13 IMPDEF14 IMPDEF15 IMPDEF16 IMPDEF17 IMPDEF18 IMPDEF19 IMPDEF20 IMPDEF21 IMPDEF22 IMPDEF23 IMPDEF24 IMPDEF25 IMPDEF26 IMPDEF27 IMPDEF28 IMPDEF29 IMPDEF30 IMPDEF31 IMPDEF32 IMPDEF33 IMPDEF34 IMPDEF35 IMPDEF36 IMPDEF37 IMPDEF38 IMPDEF39 IMPDEF40 } {$DEFINE IMPORTDEF400 IMPORTDEF40 IMPDEF400 } {$DEFINE IMPORTDEF500 IMPORTDEF400 IMPDEF500 } {$DEFINE IMPORTDEF600 IMPDEF600 IMPDEF700 } {$DEF

Создано по материалам из источника по ссылке.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:33:25/0.0043880939483643/0