[fpc-pascal] Linux library access violation
Chris
chris at venturexs.com
Mon Oct 30 01:13:30 CET 2006
I get an "Access violation" when I call a function from a C library.
Not sure if I can explain well enough, so I will just post the code:
The C library:
#include <stdio.h>
#include <string.h>
int testreturn(const char *thename, char *rcity, char *rstate)
{
memcpy (rcity,"Boston",7);
memcpy (rstate,"Massachusetts",14);
return strlen(thename);
}
The C library is compiled and named libTester.so
The code I call to the function from is:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls,
Buttons, StrUtils;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
function testreturn(thename:pchar;rcity:pchar;rstate:pchar):integer;
stdcall; external 'libTester';
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
rlines : array[0..1] of string;
retint : integer;
ganame : string;
begin
ganame := Trim(Edit1.Text);
rlines[0] := StringOfChar('0', 80);
rlines[1] := StringOfChar('0', 80);
retint := testreturn(pchar(ganame), pchar(rlines[0]), pchar(rlines[1]));
Edit2.Text := AnsiLeftStr(rlines[0], pos(Chr(0), rlines[0]) - 1);
Edit3.Text := AnsiLeftStr(rlines[1], pos(Chr(0), rlines[1]) - 1);
Form1.Caption := 'Name Length: ' + inttostr(retint);
end;
initialization
{$I unit1.lrs}
end.
It works well but, I get a message box that pops up that says "Access
violation" press OK to continue and risk possible data corruption or
Cancel to exit.
I click OK and its fine. It returns everything correctly. That message
box is a pain though. I tried:
try
retint := testreturn(pchar(ganame), pchar(rlines[0]), pchar(rlines[1]));
except
//do something
end;
But the program just quits.
Any help?
Thanks
More information about the fpc-pascal
mailing list