[Lazarus] Newbie, porting class to FPC but get procedure assignment error

Bo Berglund bo.berglund at gmail.com
Mon Jun 22 08:11:43 CEST 2015


On Mon, 22 Jun 2015 01:00:58 +0200, Bo Berglund
<bo.berglund at gmail.com> wrote:

>When I stepped through the code I reached the first call to the driver
>via the obj file I get an exception when calling RNBOsproFormatPacket
>in this function, which is in the SPROMEPS.pas file supplied by
>SafeNet:
>
>FUNCTION SproInitialize( ApiPacket : RB_SPRO_APIPACKET_PTR ) : WORD;
>VAR
>    returnVal : WORD;
>BEGIN
>    returnVal := RNBOsproFormatPacket (ApiPacket,
>RB_SPRO_APIPACKET_SIZE);
>    IF returnVal <> SP_SUCCESS THEN
>       SproInitialize := returnVal
>    ELSE
>       SproInitialize := RNBOsproInitialize (ApiPacket);
>END; { SproInitialize }
>
>Exception text:
>
>"Project DongleTest raised exception class
>'External: SIGSEGV'."
>
To clarify:
The error happens when I call RNBOsproFormatPacket, which is the first
time any driver interface function is called.

I have googled SIGSEGV and understand that it is a memory access
error.
So I followed the ApiPacket handling through the code.

In the class definition file I have this:
const
  ...
   RB_SPRO_APIPACKET_SIZE         = 1028;
  ...
type
  RB_SPRO_APIPACKET = ARRAY [1..1028] OF CHAR;{ Spro API Packet }
  RB_SPRO_APIPACKET_PTR  = ^RB_SPRO_APIPACKET;

  { TSentinel }
  TSentinel = class
    private
      FSentinelPacket : RB_SPRO_APIPACKET;
      ....

Then in the dongle initialization method I have this:

{Check if the key is initialized, then find first key on system}
  status := InitSuperProKey(FSentinelPacket);

InitSuperProKey() looks like this:

function TSentinel.InitSuperProKey(var thePacket: RB_SPRO_APIPACKET):
word;
var
  error : WORD;
begin
  Result := 0;
  error := SproInitialize(@thePacket);
  if error <> 0 then begin
    Result := error;
    exit;
  end;
  error := SproFindFirstUnit(@thePacket, DeveloperID);
  if error <> 0 then
    Result := error;
end;

And SproInitialize is shown in my previos post above as:

FUNCTION SproInitialize( ApiPacket : RB_SPRO_APIPACKET_PTR ) : WORD;
VAR
    returnVal : WORD;
BEGIN
  returnVal:=RNBOsproFormatPacket (ApiPacket,RB_SPRO_APIPACKET_SIZE);
    IF returnVal <> SP_SUCCESS THEN
       SproInitialize := returnVal
    ELSE
       SproInitialize := RNBOsproInitialize (ApiPacket);
END; { SproInitialize }


So to me it seems strange that there should be a memory access problem
since the "packet" is an array of fixed size which is a private member
of the object only used by the object itself via the pointer....


-- 
Bo Berglund
Developer in Sweden





More information about the Lazarus mailing list