comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen.a.leake.1@gsfc.nasa.gov>
Subject: Re: Help with GNAT, WinNT, StdCall, dll, exported names
Date: 11 Oct 2001 09:28:22 -0400
Date: 2001-10-11T13:30:13+00:00	[thread overview]
Message-ID: <un12ye26h.fsf@gsfc.nasa.gov> (raw)
In-Reply-To: %lfx7.6$_o6.503@newsc.telia.net

"Peter Hend�n" <phenden@tdab.com> writes:

> I'm using gnat 3.13p, trying to build a dll that exports functions
> that are to be called by a windows service. The problem is
> that the functions are declared in the .h file as
> 
> BOOL WINAPI Foobar(LPFUNNY_STRUCT fum);
> 
> Now I have defined an Ada function for this, and
> it works fine when I export it as
> pragma Export(C, Foobar, "Foobar");.
> 
> Of course this will be called exactly once, because
> it is the wrong calling convention, and after its return
> the stack is fubar.
> 
> When I try to declare it StdCall instead of C, I am
> not able to link it. Whatever I put in the .DEF file
> it comes out wrong. I get from the last gnatlink step
> in gnatdll:
> 
> mydll.exp(.edata+0x34):fake: undefined reference to `Foobar'
> 
> I have tried everything in the gnat user's guide, searched
> this groups archive and generally banged my head against
> the wall in appropriate - and perhaps not so appropriate -
> ways. Please help!

You don't mention what C compiler you are using. I have found that
different C compilers (and different Ada compilers) have different
naming conventions, usually having to do with prepending and
underscore. Here's my matrix:

compiler    calling     function    link    DLL
            convention  name        name    name

Borland C++ Cdecl       foo         _foo    _foo
            stdcall     foo         foo     foo

Borland C   Cdecl       foo         _foo    _foo
            stdcall     foo         foo     foo

GNAT Ada    C           foo         _foo    foo
            (stdcall not supported in DLLs)

Gnu C       C           foo         _foo    foo

ObjectAda
Ada         DLL_Cdecl   foo         _foo    foo
            DLL_Stdcall foo         _foo    foo


I also have this note:

Since GNAT Ada does not support the stdcall convention for DLLs, we
use the Cdecl convention everywhere. 

That was true for 3.12, apparently it's not true anymore.

Hope this helps!

-- 
-- Stephe



  parent reply	other threads:[~2001-10-11 13:28 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-10-11 11:26 Help with GNAT, WinNT, StdCall, dll, exported names Peter Hend�n
2001-10-11 11:44 ` David Botton
2001-10-11 16:06   ` Peter Hend�n
2001-10-11 19:03     ` David Botton
2001-10-11 13:28 ` Stephen Leake [this message]
2001-10-11 16:23   ` Peter Hend�n
2001-10-11 19:24   ` David Botton
2001-10-11 23:28     ` Peter Hend�n
2001-10-11 23:46       ` David Botton
2001-10-12  9:48         ` Peter Hend�n
2001-10-11 17:59 ` Sergey Koshcheyev
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox