3

ADOConnection と ADOQuery を含む dll (Delphi) がありますが、呼び出された DLL を Java で (JNA を使用して) 実行すると、コンソールにいくつかのエラー情報が表示されます (以下)。

Java ランタイム環境によって致命的なエラーが検出されました:

内部エラー (0xeedfade)、pid=4400、tid=3840

JRE バージョン: 6.0_25-b06 Java VM: Java HotSpot(TM) Client VM (20.0-b11 混合モード、windows-x86 を共有) 問題のあるフレーム: C [KERNELBASE.dll+0x812f]

詳細情報を含むエラー レポート ファイルが次の場所に保存されます: C:\Users\Mmn1\Documents\NetBeansProjects\FLMOPDL\hs_err_pid4400.log

バグ レポートを提出したい場合は、http:
//java.sun.com/webapps/bugreport/crash.jspにアクセスしてください 。クラッシュは、ネイティブ コードの Java 仮想マシンの外部で発生しました。バグを報告する場所については、問題のあるフレームを参照してください。

これは何のバグですか?(フォームがある場合、または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);
}

結論: コンポーネントを使用すると、このエラーが発生します。手伝ってくれてありがとう。

4

2 に答える 2

2

メッセージによると、問題は

Java 仮想マシンの外部

この場合、それはおそらく Delphi コードにあります。

Delphi コードの開発者に連絡して、問題のトラブルシューティングを支援できるかどうかを確認するか、自分でコードを参照して何が起こっているかを確認してください。hs_err_pid4400.logファイルには、彼らにとって貴重な情報が含まれます。

いずれにせよ、Delphi のソース コードがなければ、問題のトラブルシューティングは困難です。

于 2013-04-02T12:26:24.500 に答える
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();

}

kobik と technomage に感謝しますCoInitialize

私を助けたリンク:

Delphi ISAPI アプリのアプリケーション初期化セクションで TADOConnection が失敗する:

CoInitializing 定数を追加し、ドキュメントを改善する

JNA 経由で Java から COM を使用する

于 2013-04-02T16:08:30.547 に答える