DLL (Delphi)与ADO(连接和查询)不工作在Java(使用jna)



我有一个包含ADOConnection和ADOQuery的dll (Delphi),但是当在java中运行调用的dll(使用JNA)时出现一些错误信息到控制台(下面):

Java运行时环境检测到致命错误:

内部错误(0xeedfade), pid=4400, tid=3840

JRE version: 6.0_25-b06 Java VM: Java HotSpot(TM) Client VM(20.0-b11混合模式,共享windows-x86)问题框架:C[KERNELBASE.dll + 0 x812f]

包含更多信息的错误报告文件保存为:C:UsersMmn1Documents NetBeansProjects FLMOPDL hs_err_pid4400.log

如果您想提交错误报告,请访问:
http://java.sun.com/webapps/bugreport/crash.jsp崩溃发生了在Java虚拟机之外的本地代码。看到问题报告错误的框架。

这是什么bug ?(我意识到,只有当我有一个窗体或作为ADOConnection ADOQuery的情况下的组件,如果我删除这些组件并执行一个简单的功能,它正常工作时才会发生)。

编辑:

下面是一个类似的例子:

library TESTLIB;
{$DEFINE TESTLIB}
uses
  System.SysUtils,
  System.Classes,
  TestInt in 'TestInt.pas',
  Vcl.Dialogs,
  sharemem,
  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); <- With this i got a error!
end;
exports MyReturn;
begin
end.
Java

接口

public interface TestInt extends StdCallLibrary {
    TestInt INSTANCE = (TestInt)Native.loadLibrary("C:/test/Win32/Debug/TESTLIB", TestInt.class);
    class Test extends Structure {
        public String vResult;
        public Test() { }
        public Test(int x, Pointer p) {
            super(p);
            read();
        }
        protected List getFieldOrder() { return Arrays.asList(new String[] { "vResult" }); }
    }
    Boolean MyReturn(int x, Test test);
}

结论:当我使用组件时,会引发这个错误。谢谢你的帮助。

根据消息,问题是

在Java虚拟机之外

在本例中,它可能在Delphi代码中。

您可能需要联系Delphi代码的开发人员,看看他们是否可以帮助解决问题,或者自己浏览代码以查看发生了什么。hs_err_pid4400.log文件将包含对他们有价值的信息。

无论如何,如果没有Delphi源代码,很难排除问题。

重新编辑:

我得到了答案。问题是"如何"创建DLL。下面是解决方案,我希望它能帮助更多的人:

TESTLIB (Delphi)

library TESTLIB;
{$DEFINE TESTLIB}
uses
  System.SysUtils,
  System.Classes,
  TestInt in 'TestInt.pas', //here's my unit (interface)
  Vcl.Dialogs,
  ADODB,
  Vcl.Forms;
  {$R *.res}

function MyReturn(Test: PTest): Boolean; stdcall;
var
  ado: TADOQuery;
  con: TADOConnection;
begin
    con := TADOConnection.Create(Application);
    ado := TADOQuery.Create(Application);
    con.ConnectionString := 'Provider=SQLOLEDB.1;Password=aaa;Persist Security Info=True;User ID=aa;Initial Catalog=aa;Data Source=127.0.0.1';
    con.LoginPrompt := False;
    con.Open();
    if con.Connected = True then
        ShowMessage('connected ok')
    else
        ShowMessage('not connected');
    ado.Active := False;
    ado.Connection := con;
    ado.SQL.Clear;
    ado.SQL.Add('select lalala from table where codlala = 1');
    try
        ado.Open();
        Test^.vResult := PAnsiChar(AnsiString(ado.FieldByName('fantasia').AsString));
        Result := True;
    except
        on E: Exception do
        begin
          ShowMessage('error to open the query' + #13 + 'Error: ' + E.Message);
          Result := False;
        end;
    end;
end;
exports MyReturn;
begin
end.

Interface Ole32 (java)

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();
}

特别感谢kobik和CoInitialize技术

帮助我的链接:

Delphi ISAPI App应用程序初始化部分TADOConnection失败:

添加CoInitializing常量并改进文档

在Java中通过JNA使用COM

最新更新