comp.lang.ada
 help / color / mirror / Atom feed
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




      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