Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chris Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Dll String Run-Time Error ?

Status
Not open for further replies.

Spent

Programmer
Mar 20, 2003
100
BG
Help I have a serious problem:
I have a application communicating with a dll through a function of type TStrings
There are no errors.But there is a Run-Time Error "EAccess Violation in module Ai.dll ...."
In the begining of the Dll there is some note.I placed ShareMem in the Project Uses but
still don't works .Can you tell me where am i wrong ?
Thanks
Spent
spentbg@yahoo.com



This is THE SOURCE OF THE DLL
library AI;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes;

{$R *.RES}

function DecodeSpeech(from:String;Text:String):TStrings;
begin
Result.Add('Hello');
Result.Add('From the Dll');
Result.Add('This Works !');
end;
exports
DecodeSpeech;

end.
------------
This is THE SOURCECODE OF THE APPLICATION
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
ListBox1: TListBox;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
function DecodeSpeech(from:String;Text:String):TStrings;stdcall;external 'Ai.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
Listbox1.Items.AddStrings(DecodeSpeech('User1','This is a Speech'));
end;

end.
 
function DecodeSpeech(from:String;Text:String):TStrings;
begin
Result.Add('Hello');
Result.Add('From the Dll');
Result.Add('This Works !');
end;

should read:

function DecodeSpeech(from:String;Text:String):TStrings;
begin
Result := TStringList.Create();
Result.Add('Hello');
Result.Add('From the Dll');
Result.Add('This Works !');
end;
 
your delphi unit will have to check for a non-nil result as well...and also, free the TStringList once it has finished....
 
Did you read this:

Code:
{ Important note about DLL memory management: ShareMem must be the
 first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

???

HTH
TonHu
 
Hi

Use fastsharemem instead of sharemem...
there are some troubles with sharemem and strings manipulations.. use instead shortstring or pchar.., but the best way is to download fastsharemem..

fastsharemem is somewhere out there and its free.. try to search at google..

cheers,
mha
 
I want to thank you all for the help.There where more than one errors in my source.
BillDoorNz This works only when the Function is of type TStringList too. I have misplaced a stdcall too.Here is the complete running source:
I found where is the problem.
I have put the corrections in {}brakets
First ShareMem must be added in the Project uses to Application and DLL
the Function must be TStringList not TStrings;
Constructor for the Result Must be called
A stdcall has been missed in the function declaration in the DLL
And now IT WORKS !
I did it.Check it out Its Very Interesting Problem.
I will place it in the Tip section too.
If you like it vote a star for it.
SPent
spentbg@yahoo.com

This is THE SOURCE OF THE DLL
library AI;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
{ShareMem,}SysUtils,Classes;

{$R *.RES}

function DecodeSpeech(from:String;Text:String):TString{List;stdcall;}
begin
{Result:=TStringList.create;}
Result.Add('Hello');
Result.Add('From the Dll');
Result.Add('This Works !');
end;
exports
DecodeSpeech;

end.
------------
This is THE SOURCECODE OF THE APPLICATION
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
ListBox1: TListBox;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
function DecodeSpeech(from:String;Text:String):TString{List};stdcall;external 'Ai.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
Listbox1.Items.AddStrings(DecodeSpeech('User1','This is a Speech'));
end;

end.
 
Did you also do:
[snip]
> your library's USES clause AND your project's
[/snip]

So: add the ShareMem unit to the uses clause in the .dpr file?

HTH
TonHu
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top