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

Использование ADOConnection и ADOQuery в DLL на Delphi для Java: решение критической ошибки JVM

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

Пользователь столкнулся с проблемой при использовании в Java через JNA (Java Native Access) библиотеки на Delphi, которая содержит компоненты ADOConnection и ADOQuery. При вызове функций из этой библиотеки в Java возникала критическая ошибка JVM, указывающая на проблему в нативном коде.

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

При запуске DLL, созданной в Delphi и содержащей ADOConnection и ADOQuery, в Java с помощью JNA, появляется сообщение об ошибке в консоли, указывающее на критическую ошибку JVM:

A fatal error has been detected by the Java Runtime Environment:
Internal Error (0xeedfade), pid=4400, tid=3840
JRE version: 6.0_25-b06
Java VM: Java HotSpot(TM) Client VM (20.0-b11 mixed mode, windows-x86)
Problematic frame: C [KERNELBASE.dll+0x812f]

Ошибка указывает на проблему в нативном коде, вне JVM. Пользователь также заметил, что ошибка возникает только при наличии компонентов ADOConnection и ADOQuery. Удаление этих компонентов и выполнение простой функции приводит к нормальной работе.

Пример кода

Приведен пример кода на Object Pascal (Delphi), который демонстрирует функцию MyReturn с использованием ADOQuery:

library TESTLIB;
{$DEFINE TESTLIB}
uses
  System.SysUtils,
  System.Classes,
  TestInt in 'TestInt.pas',
  Vcl.Dialogs,
  Data.DB,
  Data.Win.ADODB;
{$R *.res}
function MyReturn(x: Integer; Test: PTest): Boolean; stdcall;
var
  ado: TADOQuery;
begin
  Result := True;
  //ado := TADOQuery.Create(nil); // Здесь возникала ошибка!
end;
exports MyReturn;
begin
end.

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

Пользователь нашел решение проблемы. Ошибка была связана с тем, как была создана DLL. В коде Delphi использовались компоненты ADOConnection и ADOQuery, которые требовали инициализации COM. В Java для вызова функций из DLL необходимо было сначала инициализировать COM, используя функцию CoInitialize из библиотеки Ole32.

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

Вот исправленный код функции MyReturn с инициализацией ADOConnection и выполнением запроса:

function MyReturn(Test: PTest): Boolean; stdcall;
var
  ado: TADOQuery;
  con: TADOConnection;
begin
  con := TADOConnection.Create(Application);
  ado := TADOQuery.Create(Application);
  // Инициализация ADOConnection
  con.ConnectionString := '...';
  con.LoginPrompt := False;
  con.Open();
  // Настройка ADOQuery
  ado.Active := False;
  ado.Connection := con;
  ado.SQL.Clear;
  ado.SQL.Add('...');
  try
    // Открытие запроса
    ado.Open();
    // Чтение данных
    Test^.vResult := PAnsiChar(AnsiString(ado.FieldByName(...).AsString));
    Result := True;
  except
    on E: Exception do
    begin
      // Обработка исключений
      Result := False;
    end;
  end;
end;

Также необходимо инициализировать COM в Java перед вызовом функций из DLL:

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.win32.StdCallLibrary;

public interface Ole32 extends StdCallLibrary {
    Ole32 INSTANCE = (Ole32) Native.loadLibrary("Ole32", Ole32.class);

    public HRESULT CoInitialize(Pointer p);

    public HRESULT CoUninitialize();
}

После выполнения работы с DLL, не забудьте вызвать CoUninitialize, чтобы корректно завершить работу COM.

Заключение

Проблема была решена путем инициализации COM перед использованием компонентов ADOConnection и ADOQuery в DLL на Delphi и корректного вызова функций из этой DLL в Java с использованием JNA. Важно помнить, что инициализация COM должна быть выполнена в приложении, а не в самой DLL.

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

Пользователь столкнулся с критической ошибкой JVM при использовании в Java через JNA библиотеки на Delphi, содержащей компоненты ADOConnection и ADOQuery, которая решается путем инициализации COM перед вызовом функций из 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:42:30/0.003525972366333/0