Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   dll verursacht nach dem Ausführen Zugriffsverletzung (https://www.delphipraxis.net/154738-dll-verursacht-nach-dem-ausfuehren-zugriffsverletzung.html)

dust258 23. Sep 2010 09:06

dll verursacht nach dem Ausführen Zugriffsverletzung
 
Hallo Leute,
ich versuche grade eine Funktion aus einer externen dll in Delphi anzusprechen. Das ganze funktioniert so weit ich das erkennen kann auch ganz gut. Nur läuft meine prozedure danach immer auf eine Zugriffsverletzung.

Bis jetzt konnte ich sie immer über eine C# Programm problemlos ansprechen:
Code:
      [DllImport(DLLPath, EntryPoint="LoadJavaVM", CharSet=CharSet.Ansi,
          SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.Cdecl)]
      public static extern int loadJavaVirtualMachine(string InstallPath, int maxMem);
loadJavaVirtualMachine(secSignerInstallPath, maxMem); //liefert 0 zurück wenn OK


Genau diese dll wollte ich nun auch in Delphi einbinden.
Code:
uses
  ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TExt_LoadJavaVM_ = function(inInstallPath : PChar; maxMem : Integer): Integer; stdcall;

type
  TFormDllTest = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
    InstallPath : PChar;
    maxMem : LongInt;
    DSLoadJavaVM: TExt_LoadJavaVM_;
    procedure loadVM;
  end;

var
  FormDllTest: TFormDllTest;

implementation

{$R *.dfm}

procedure TFormDllTest.Button1Click(Sender: TObject);
begin
  loadVM;
  Showmessage('hi'); //Diese Message wird niemals angezeigt
end;

procedure TFormDllTest.loadVM;
var
  LibHandle: THandle;
  liTest : integer;
begin
  LibHandle := loadLibrary('CallSecSignerDLL.dll');
  if LibHandle <> 0 then
    @DSLoadJavaVM := getProcAddress(LibHandle, 'LoadJavaVM');
  if (@DSLoadJavaVM <> nil) then
  begin
    liTest := DSLoadJavaVM('c:\extS', 256);
  end;
  freeLibrary(LibHandle);
  Showmessage(IntToStr(lITest)); //Diese Message wird noch angezeigt und gibt 0 zurück (0 = erfolgreich)
end;

end.
Die Prozedur loadVM wird ausgeführt, die funktion DSLoadJavaVM gibt mit ihrem Rückgabewerte an, dass der Vorgang erfolgreich war, aber nach Abschluss der Prozedur erscheint folgende Fehlermeldung:

"Im Projekt ... trat eine Problem mit folgender Meldung auf: 'access violation at 0x00000000: read of address 0x00000000'. Prozess angehalten. Einzelne Anweisungen oder Start fortsetzen"

Hat Jemand eine Idee?

Blup 23. Sep 2010 10:03

AW: dll verursacht nach dem Ausführen Zugriffsverletzung
 
"cdecl" und "stdcall" unterscheiden sich:

http://de.wikipedia.org/wiki/Aufrufkonvention

dust258 23. Sep 2010 10:53

AW: dll verursacht nach dem Ausführen Zugriffsverletzung
 
Super, danke. Jetzt funktioniert es ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf