我有一个包含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);
}
结论:当我使用组件时,此错误会引发。谢谢你的帮助。
答案 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
帮助我的链接:
TADOConnection failing in application initialization section of Delphi ISAPI App: