From: "Barry Scott" <cbscott__@ingr.com>
Subject: Re: GNAT, Windsock, and DLLs
Date: 1998/04/14
Date: 1998-04-14T00:00:00+00:00 [thread overview]
Message-ID: <l6Rk776Z9GA.177@news2.ingr.com> (raw)
In-Reply-To: 6gvp5f$evp$1@owens.ridgecrest.ca.us
I'm not sure it matters for your code, but the dll is winsock.dll, not
windsock.dll.
Barry
Do-While Jones wrote in message <6gvp5f$evp$1@owens.ridgecrest.ca.us>...
>The general question is, "How does GNAT link Ada 95 programs with Windows
>95 DLLs?"
>
>More specifically, "How can GNAT make use of the Berkeley-like socket
>services in windsock.dll?"
>
>In particular, "What do I need to do to get a demo program (included at
>the end of this message) to call the gethostname service in windsock.dll?"
>
>Background
>
>Several years ago, I wrote a collection of Network Interface packages
>which allow Ada 83 programs (compiled using the Telesoft Telegen 2
>compiler on a Sun Sparcstation 2) to call the Berkeley BSD socket
>routines. These thick bindings gave me handy abstractions that send and
>receive UDP broadcasts, and implement TCP/IP clients and servers.
>
>A couple years ago I ported these packages from our Sun workstations to
>GNAT (Ada 95) on Silicon Graphics in no time at all. This was easily done
>because the Silicon Graphics was using a UNIX operating systems with
>Berkeley sockets.
>
>A few months ago I tried to port these same packages to GNAT (Version
>3.10) on a Windows 95 machine. Windows 95 comes with a dynamically linked
>library (DLL) called windsock, which emulates all the Berkeley socket
>services. One of the simplest of these is gethostname, which returns a
>character string containing the name of the host computer.
>
>The Problem
>
>Use gnatchop to divide the program at the end of this message into three
>compilation units. Then use gnatmake to compile and link ni09td01.
>(Network Interfaces, component 9, Test Demo program 1.) The program
>compiles, but fails at the link stage with an error message that says
>there is an "undefined reference to 'gethostname' in get_host.adb".
>Clearly, GNAT doesn't know about the gethostname service in windsock.dll.
>
>The GNAT UserUs Guide section on "Search Paths for gnatbind" (yes, I'm one
>of those few people who read the documentation) says that you can tell the
>linker to look for modules in other directories in several ways. One of
>these ways is to set the environment variable ADA_OBJECTS_PATH. So, I set
>ADA_OBJECTS_PATH to "C:\WINDOWS\SYSTEM" where the windsock.dll is (on my
>system, at least). That didn't work.
>
>I suspect gnatbind is looking for a ".o" file, not a ".dll" file.
>
>I know very little about C, and even less about Windows 95. I suspect
>this problem is more of a C/Windows 95 problem than an Ada problem.
>
>What is the solution?
>
>Do I have to write a zillion (well, actually eight, since I only use
>socket, bind, accept, fcntrl, open, close, read, write, and gethostname)
>little C programs that call each windsock service individually, and put
>their ".o" files somewhere that GNAT can find them? Is there a way to get
>GNAT to use the windsock.dll directly?
>
>If there is a simple solution, I'm sure many readers of Comp.lang.ada
>would find it useful.
>
>Thanks in advance,
>
>Do-While Jones
>-------------------------------------------------------------
>
>-- ni09ks01.ada
>-- 13 December 1994
>
>-- Do-While Jones
>-- 324 Traci Lane
>-- Ridgecrest, CA 93555
>-- do_while@ridgecrest.ca.us
>
>--with NETWORK; -- part NI02
>
>package GET_HOST is
>
> function Name return string;
> -- Tells you the name of the computer that is executing
> -- the program.
>
> --function Network_Address return NETWORK.Address_numbers;
> -- Tells you the network address of the computer that
> -- is executing the program.
>
>end GET_HOST;
>
>-- ni09kb01.ada
>-- 13 December 1994
>
>-- Do-While Jones
>-- 324 Traci Lane
>-- Ridgecrest, CA 93555
>-- do_while@ridgecrest.ca.us
>
>with SYSTEM;
>
>package body GET_HOST is
>
> --- Interface to UNIX service ---
>
> function gethostname(
> name_receiver : SYSTEM.Address;
> namelen : integer)
> return integer;
> pragma Interface(C, gethostname);
>
> ---------------------------------
>
> function Name return string is
> -- Assume the name will be 20 characters
> -- or less.
> C_STRING : string(1..21)
> := (others => ASCII.NUL);
> UNIX_RESULT : integer;
> LENGTH : integer;
> begin
> -- Call a UNIX service to put the name
> -- in C_STRING.
> UNIX_RESULT := gethostname(
> C_STRING(1)'ADDRESS, C_STRING'LENGTH);
> if UNIX_RESULT /= 0 then
> -- UNIX failure.
> return "HOST_NAME_ERROR";
> end if;
>
> -- Find out how long the string is.
> LENGTH := 0;
> for i in C_STRING'RANGE loop
> exit when C_STRING(i) = ASCII.NUL;
> LENGTH := i;
> end loop;
>
> -- Return the non-null characters of the string.
> return C_STRING(1..LENGTH);
> end Name;
>
> --function Network_Address
> --return NETWORK.Address_numbers is
> --begin
> --return NETWORK.Host_Number(Name);
> --end Network_Address;
>
>end GET_HOST;
>
>-- ni09td01.ada
>-- 13 December 1994
>
>-- Do-While Jones
>-- 324 Traci Lane
>-- Ridgecrest, CA 93555
>-- do_while@ridgecrest.ca.us
>
>with TEXT_IO,
> --NETWORK, -- part NI02
> GET_HOST; -- part NI09
>
>procedure NI09TD01 is
>begin
> TEXT_IO.Put_Line("This machine is "
> & GET_HOST.Name & ".");
> --TEXT_IO.Put_Line("It is at address "
> --& NETWORK.Image(GET_HOST.Network_Address)
> --& ".");
>end NI09TD01;
>
>
next prev parent reply other threads:[~1998-04-14 0:00 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
1998-04-14 0:00 GNAT, Windsock, and DLLs Do-While Jones
1998-04-14 0:00 ` Tom Moran
1998-04-14 0:00 ` Barry Scott [this message]
1998-04-16 0:00 ` Stephen Leake
1998-04-16 0:00 ` Jerry van Dijk
1998-04-16 0:00 ` Martin C. Carlisle
1998-04-16 0:00 ` Jerry van Dijk
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox