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

Giuliano Colla giuliano.colla at fastwebnet.it
Mon Jun 22 12:39:18 CEST 2015


Il 22/06/2015 10:09, Bo Berglund ha scritto:
> On Mon, 22 Jun 2015 09:16:20 +0300, patspiper <patspiper at gmail.com>
> wrote:
>
>> On 22/06/15 02:00, Bo Berglund wrote:
>>> I just made a first test by adding the object to my main form as a
>>> private variable.
>> Which object? Better show the code.
> Here is the current state of the main form where the object is
> handled:
>
> unit FormMain;
>
> {$mode objfpc}{$H+}
>
> interface
>
> uses
>    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
> StdCtrls,
>    ExtCtrls,
>    Sentinel;
>
> type
>
>    { TfrmMain }
>
>    TfrmMain = class(TForm)
>      btnFindKey: TButton;
>      stxSerialNo: TStaticText;
>      procedure btnFindKeyClick(Sender: TObject);
>      procedure FormClose(Sender: TObject; var CloseAction:
> TCloseAction);
>      procedure FormCreate(Sender: TObject);
>      procedure Timer1Timer(Sender: TObject);
>    private
>      { private declarations }
>      Dongle: TSentinel; <== My private object variable
>    public
>      { public declarations }
>    end;
>
> var
>    frmMain: TfrmMain;
>
> implementation
>
> {$R *.lfm}
>
> { TfrmMain }
>
>
> procedure TfrmMain.btnFindKeyClick(Sender: TObject);
> var
>    SerialNo: word;
> begin
>    //Code to check for the dongle and if found display its contents
>    Dongle.InitKey; <= I get the exception here
>    Dongle.AppNumber := 1;
>    if Dongle.CheckKey then
>    begin
>      SerialNo := Dongle.SerialNo;
>      stxSerialNo.Caption := IntToStr(SerialNo);
>    end;
> end;
>
> procedure TfrmMain.FormClose(Sender: TObject; var CloseAction:
> TCloseAction);
> begin
>    Dongle.Free; <= Destroying the object
> end;
>
> procedure TfrmMain.FormCreate(Sender: TObject);
> begin
>    Dongle := TSentinel.Create; <= Creating the object
> end;
>
> end.
>        
>>> "Project DongleTest raised exception class
>>> 'External: SIGSEGV'."
>> The 1st thing that comes to mind is that spromeps.obj is 32 bit and your
>> Lazarus/fpc and Windows are most probably 64 bit. But I am not sure how
>> the compiler/linker would react to that.
> I think I create a 32 bit application, see below.
>
>> You had posted previously:
>> Input file: SPROMEPS.obj, output file: SPROMEPS.coff
>> Converting from OMF32 to COFF32 <--------------------------------
>> Not adding or removing underscores for this filetype
>> Warning 1211: 270 comment records ignored
>>
>> Do you have a 64 bit version of spromeps.obj?
> No, this is legacy code and is only for 32 bit applications.
> SafeNet has created the driver for both 32 and 64 bit Windows, but the
> 64 bit driver is still used for 32 bit applications (like mine). Has
> always worked fine with the Delphi apps (used since end of the
> 1990:s).
>
> They did not provide a SPROMEPS.obj file for 64 bit Delphi maybe
> because that does not really exist yet (according to the Embarcadero
> user forum the newly released 64 bit compiler is not ready for prime
> time...)
>
> Question:
> Could it be that Lazarus is anyway compiling for a 64 bit application
> since it is installed on a 64 bit Windows 7 laptop?
> I just assumed that the main application would be 32 bit as is the
> case for Delphi....
>
> But if I go into Project Options and look at Compiler Options ->
> Config and Target -> Target-specific options there is a checkbox for
> "Win32 gui application (-WG)" and it is checked.
>
> So I guess I am creating a Win32 exe as intended...
>
>

Both Win32 and Win64 generate the same compiler option(-WG)

In the same configuration page you should also pick up the right Target 
CPU family: i386 as opposed to X86_64, in order to generate a 32bit 
application. This will require the proper 32 bit compiler. If it isn't 
available or properly configurated you'll get a warning, when you click 
the Test button on the page.

Giuliano






More information about the Lazarus mailing list