Warum erzeugt diese Dll-Code "External: SIGSEGV" exception.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Warum erzeugt diese Dll-Code "External: SIGSEGV" exception.

Beitrag von Bora4d »

Ich habe noch eine Frage. Weiß jemand warum untere Dll-Code beim Beenden des Programms Exception-Klasse "External: SIGSEGV" auslöst?
DLL:

Code: Alles auswählen

===callblib.lpr:===
 
library callblib;
 
{$mode objfpc}{$H+}
 
uses
  Classes, callblibunit
  { you can add units after this };
 
{$R *.res}
 
exports GetNr;
exports SetCallProc;
exports TestCall;
 
begin
end.  
 
====callblibunit.pas:=====
 
unit callblibunit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes;//, SysUtils;
 
type
  TCallFromDllProc = procedure(ANr: longint);//auch mit stdcall; gibts "External: SIGSEGV"
 
var
  ProgPoc: TCallFromDllProc;
  TestItNr : integer =101;
 
function GetNr:Integer; stdcall;
procedure SetCallProc(FromProgram: TCallFromDllProc); stdcall;
procedure TestCall; stdcall;
 
implementation
 
function GetNr:Integer; stdcall;
begin
  Result:=TestItNr;
end;
 
procedure SetCallProc(FromProgram: TCallFromDllProc); stdcall;
begin
  ProgPoc:=FromProgram;
end;
 
procedure TestCall; stdcall;
begin
  if @ProgPoc<>nil then TCallFromDllProc(ProgPoc)(TestItNr);
  //für delphi: if @ProgPoc<>nil then TCallFromDllProc(ProgPoc)(TestItNr);
end;
 
initialization
 
finalization
 
end.
Testprogramm:

Code: Alles auswählen

===callblibtest.lpr=========
 
program callblibtest;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this },
  SysUtils;
 
{$R *.res}
 
type
  TCallFromDllProc = procedure(ANr: longint); // auch mit stdcall; gibts "External: SIGSEGV"
 
function GetNr:Integer; stdcall; external 'callblib.dll' name  'GetNr';
procedure SetCallProc(FromProgram: TCallFromDllProc); stdcall; external 'callblib.dll' name  'SetCallProc';
procedure TestCall; stdcall; external 'callblib.dll' name  'TestCall';
 
procedure ProgCallProg(ANr: longint);
begin
  Writeln('Wurde von Dll-Aufgerufen: '+IntToStr(ANr));
end;
 
begin
  SetCallProc(@ProgCallProg);
  Writeln('Ich rufe auf: '+IntToStr(GetNr));
  TestCall; //ereignis simulieren
  Writeln('[ENTER] drücken zum beenden: ');
  Readln;
  SetCallProc(nil);
  Writeln('.. und tschüsssssss. ');
end.
Wenn ich Dll mit Delphi erzeuge gibts es keine Fehlermeldung.
Fehlermeldung 'Exception-Klasse "External: SIGSEGV" ausgelöst.' erscheint nur wenn man das Testprogramm von ide startet.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Warum erzeugt diese Dll-Code "External: SIGSEGV" exception.

Beitrag von carli »

Fehler in der Aufrufkonvention:

in der ersten Source hast du die Konvention mit "stdcall;" angegeben, unten dann aber nicht mehr.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Warum erzeugt diese Dll-Code "External: SIGSEGV" exception.

Beitrag von Bora4d »

carli hat geschrieben:...
in der ersten Source hast du die Konvention mit "stdcall;" angegeben, unten dann aber nicht mehr.
Wo ist es?
Wen du "procedure ProgCallProg(ANr: longint);" meinst da hatte ich auch "stdcall;" angegeben, wenn ich oben (und in dll auch) die Funktion als "stdcall;" definiert hatte. Das habe ich als Kommentar erwähnt.

Antworten