Larry Hall wrote:
At 01:14 PM 9/22/2004, you wrote:
-----Original Message-----
From: Frédéric ORMANCEY
Sent: 22 September 2004 18:07
I did it, but it don't work !
Ah, ok, that was not clear from your last message!
The --enable-stdcall-fixup option suppress one warning on top
of linker output trace :
AVERTISSEMENT: résolution de _GetModuleHandleA par un
lien vers _GetModuleHandleA@4
and unfortunatly leave ALL other errors with no effect on it.
I see. Hmm. That's very strange; it should affect all the errors - that
is, if they're all the same kind of error. OTOH it could be that you've
gotten the calling conventions wrong with the other pragmas, so that's why
--enable-stdcall-fixup doesn't work for them; there must be some different
reason why the errors are caused, since they behave differently.
You might care to experiment with the "--enable-auto-import" and, failing
that, "--enable-extra-pe-debug" options as well.
Or Frédéric could try specifying the link symbol he wants in the pragma
as suggested by an earlier poster (sorry, the thread is broken in the
archives and I didn't put any effort into wading through the messages
to trace it all back to that message).
That was me - but it seems Dave Korn's post broke the thread. But isn't
it easy enough to sort messages on subject?
Anyway, I tried a noddy example, as follows...
Cliff@enigma ~
$ cat imp.adb
procedure imp is
procedure Doit(A : integer; B : boolean; C : character);
pragma Import (Stdcall, Doit, "FormatMessageA");
begin
Doit(1, true, 'x');
end;
Cliff@enigma ~
$ gnat compile imp.adb
gcc -c imp.adb
Cliff@enigma ~
$ nm imp.o
00000000 b .bss
00000000 d .data
00000000 t .text
U _FormatMessageA@12
00000000 T __ada_imp
So Gnat is generating a stdcall-style linker symbol with @12 (the
parameter block size) correctly appended. If Frédéric is not seeing
this with stdcall, it is probably an indication that the specification
used for Doit is wrong - ie it hasn't been defined to take any parameters.
If you change the pragma line to
pragma Import (Stdcall, Doit, Link_Name => "FormatMessageA");
the symbol is generated as
U FormatMessageA@12
so you can generate it without the leading underscore, but with the
stdcall postfix, if you wish.
[Note - the above is just an example - the *real* FormatMessageA should
take 7 words (28 bytes) of parameters, and the Ada spec should match the
kernel32 definition.]
-- Cliff
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/