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

Решение проблемы с передачей вещественных значений в 64-битной DLL для Excel 2013 в Delphi XE5

Delphi , Файловая система , DLL и PlugIns

Разработчики, работающие с такими технологиями, как Delphi и Pascal, иногда сталкиваются с неожиданными проблемами, особенно при переходе на 64-битные приложения. Одной из таких проблем является некорректная работа с вещественными числами в 64-битных DLL, предназначенных для взаимодействия с Excel 2013. В данной статье мы рассмотрим типичную проблему и её решение на основе реального примера.

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

Пользователь столкнулся с проблемой при попытке создания 64-битной DLL в Delphi XE5 для взаимодействия с 64-битной версией Excel 2013. Простейший пример кода, который должен был умножать вещественное число на 2, не работал: значение, передаваемое из Excel, всегда интерпретировалось как ноль. При этом обратная передача данных из DLL в Excel функционировала корректно.

Пример кода

Вот пример кода, который был использован для создания DLL:

library test64;
function xx(x : double) : double; stdcall;
begin
    Result := x*2;
end;
exports
    xx;
end.

Код был скомпилирован в конфигурации Win64. В Excel 2013 64-битная версия функция была объявлена следующим образом:

Declare PtrSafe Function xx Lib "путь\к\файлу\test64.dll" (ByVal x As Double) As Double

Разбор проблемы

Проблема заключалась в неправильной передаче параметров. По умолчанию параметры передаются по ссылке (ByRef), но в данном случае необходимо было явно указать передачу по значению (ByVal). В 32-битных приложениях параметр типа double передается по адресу, что может работать корректно и без явного указания режима передачи параметров. В 64-битных приложениях параметры могут передаваться в регистрах, что требует более точной настройки режима передачи.

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

Для решения проблемы необходимо:

  1. Явное указание режима передачи параметра ByVal в объявлении функции в Excel:
Declare PtrSafe Function xx Lib "путь\к\файлу\test64.dll" (ByVal x As Double) As Double
  1. Обертка вызова внешней функции в VBA-функцию, которую можно вызвать из листа:
Public Function Callxx(ByVal x As Variant) As Variant
    Callxx = xx(x)
End Function

Заключение

Следуя этим шагам, пользователь смог успешно решить проблему с передачей вещественных значений в 64-битной DLL для Excel 2013, созданной в Delphi XE5. Важно помнить о различиях в передаче параметров между 32-битными и 64-битными приложениями и всегда использовать явное указание режима передачи параметров, когда это необходимо.

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

Проблема заключается в неправильной передаче вещественных значений между 64-битной DLL, созданной в Delphi XE5, и Excel 2013, из-за чего передаваемые значения некорректно интерпретировались, и для её решения необходимо использовать явное указание режима


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

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




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


:: Главная :: DLL и PlugIns ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:55:08/0.0033750534057617/0