带有ADO(连接和查询)的DLL(Delphi)在Java中不起作用(使用jna)

时间:2013-04-02 12:20:49

标签: java delphi dll jna

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

  

Java Runtime Environment检测到致命错误:

     

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

     

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

     

包含更多信息的错误报告文件保存为:   C:\ Users \用户Mmn1 \文件\的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);
}

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

2 个答案:

答案 0 :(得分:2)

根据消息,问题是

  

在Java虚拟机之外

在这种情况下,它可能在Delphi代码中。

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

无论哪种方式,如果没有Delphi源代码,很难解决问题。

答案 1 :(得分:0)

重新编辑:

我得到了解决方案。问题是“如何”DLL已经制作。在解决方案下方,我希望它能帮助更多人:

TESTLIB(德尔福)

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.

接口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();

}

特别感谢关于CoInitialize

的kobik和technomage

帮助我的链接:

TADOConnection failing in application initialization section of Delphi ISAPI App:

Add CoInitializing constants and improve documentation

Using COM from Java via JNA