我有一个包含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