From: John Walker <john@jswalker.demon.co.uk>
Subject: Re: HELP: DLL's, parameter passing problem
Date: 1999/09/28
Date: 1999-09-28T00:00:00+00:00 [thread overview]
Message-ID: <Hk5XjHA4qN83EwX+@jswalker.demon.co.uk> (raw)
In-Reply-To: 938430099.1211.0.nnrp-13.c2deb6db@news.demon.co.uk
In article <938430099.1211.0.nnrp-13.c2deb6db@news.demon.co.uk>, Roger
Pearse <rpearse@spamtrap.chieftainsys.demon.co.uk> writes
>I'd be grateful for a bit of help. I'm trying to do a DLL in
>Aonix ObjectAda 7.1. I've adapted the supplied example,
>and I've run into difficulties when trying
>to pass and return a parameter (any parameter). The code
>runs, but the value returned seems to be random.
>
>Can anyone tell me what I'm doing wrong? Also, can I do
>IN OUT parameters - I'd like to pass strings.
>
>TIA
>
>Roger Pearse
Your code worked for me. I am using OA 7.1.2 and NT 4.0.
You can use other parameter types but be aware that convention DLL
implies DLL_cdecl. That brings into play the recommendations in LRM B.3
(63-75) such that a string is passed as the address of the first
character and housekeeping information is lost. Within the called
subprogram the string is seen as maximum length, witness the following
code.
----------------------------DLL.DLL----------------
--Creating the DLL
package P is
function GetArgument (I : Integer) return Integer;
pragma Export (DLL, GetArgument);
function DLLProc (S : String) return Integer;
pragma Export (DLL, DLLProc);
end;
with Ada.Text_IO;
package body P is
function GetArgument (I : Integer) return Integer is
begin
return I;
end GetArgument;
function DLLProc (S : String) return Integer is
begin
Ada.Text_IO.Put_Line (S (1 .. 5));
Ada.Text_IO.Put_Line (S (1 .. 9));
return S'Length;
end DLLProc;
end P;
with P;
procedure DLL is
begin
null; -- perform any initializations here
end;
-----------USEDLL.EXE (console program)----------------
--Calling the DLL
package P is
function GetArgument (S : String) return Integer;
pragma Import (DLL, GetArgument);
function DLLProc (S : String) return Integer;
pragma Import (DLL, DLLProc);
end;
with Ada.Text_IO;
with System, Unchecked_Conversion;
with P;
procedure UseDLL is
S : String (1 .. 9) := "123456789";
function To_Integer is
new Unchecked_Conversion (System.Address, Integer);
begin
Ada.Text_IO.Put_Line (Integer'Image (
To_Integer(S(S'First)'Address)));
Ada.Text_IO.Put_Line (Integer'Image (P.GetArgument (S (1 .. 5))));
Ada.Text_IO.Put_Line ("P.DLLProc =>" &
Integer'Image (P.DLLProc (S)));
end;
--
John Walker
Email: john@jswalker.demon.co.uk
Web: http://www.jswalker.demon.co.uk/
Tel: +44 (0) 118 9403749
prev parent reply other threads:[~1999-09-28 0:00 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-09-27 0:00 HELP: DLL's, parameter passing problem Roger Pearse
1999-09-28 0:00 ` John Walker [this message]
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox