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

Передача строк из MS Access VBA в Delphi DLL: решение проблемы

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

Работа с внешними библиотеками из среды MS Access VBA может быть непростой задачей, особенно когда речь идет о передаче строк в Delphi DLL. В данной статье мы рассмотрим типичную проблему, с которой сталкиваются разработчики, и предложим решение, которое позволит избежать использования ShareMem.

Проблема и контекст

Разработчик столкнулся с необходимостью передачи строки из макросов MS Access VBA в Delphi DLL для обработки внутри DLL. Среда разработки: Delphi 2010 и Access 2010. Задача кажется простой, но после нескольких часов поиска решения в интернете разработчик не смог найти удовлетворительный ответ.

Код в MS Access VBA выглядит следующим образом:

Option Compare Database
Private Declare Function callForm Lib "C:\Programing_contract\MyWork_2014\AccessDLL\build\access.dll" (ByRef par As Variant) As Long
Private Sub Button0_Click()
    MsgBox callForm("alex")
End Sub

Функция в Delphi DLL описана так:

function callForm(par: PChar): Integer; export; stdcall;
var
  buf: PWideChar;
  s: String;
  rs: RawByteString;
begin
  frmAccessTest.Caption := par;
  frmAccessTest.ShowModal;
  Result := 456;
end;

При вызове функции callForm с передачей строки "alex" ожидается, что заголовок формы frmAccessTest будет изменен на "alex", но вместо этого получаем неверный результат.

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

Для решения проблемы необходимо учесть несколько моментов:

  1. В MS Access VBA следует явно указать тип параметра как String и использовать передачу по значению (ByVal).
  2. В Delphi DLL тип параметра следует изменить на PAnsiChar, так как PChar в Delphi 2010 является псевдонимом для PWideChar в режиме Unicode.
  3. Директива export в Delphi не требуется и может быть удалена.

Исправленный код в MS Access VBA:

Private Declare Function callForm Lib "C:\Programing_contract\MyWork_2014\AccessDLL\build\access.dll" (ByVal par As String) As Long

Исправленный код в Delphi DLL:

function callForm(par: PAnsiChar): Integer; stdcall;
begin
  frmAccessTest.Caption := par;
  frmAccessTest.ShowModal;
  Result := 456;
end;

Альтернативное решение

Также возможно использование OleVariant для передачи строки между VBA и Delphi, однако это более сложный подход, который может привести к ошибкам, если не учитывать правильность передачи параметров (например, использование ByRef в VBA и передача по значению в Delphi).

Заключение

Передача строк из MS Access VBA в Delphi DLL требует внимательного подхода к типам данных и режиму передачи параметров. Используя предложенные выше исправления, разработчик сможет избежать распространенных ошибок и успешно решить поставленную задачу.

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

Проблема и контекст Разработчик в MS Access VBA сталкивается с трудностями при передаче строк в Delphi DLL, и требуется найти корректное решение для обработки строк в библиотеке.


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

Получайте свежие новости и обновления по 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:50:59/0.003497838973999/0