From: fjh AT cs DOT mu DOT OZ DOT AU (Fergus Henderson) Subject: Re: dll question 29 May 1998 01:28:40 -0700 Message-ID: <19980529110416.61887.cygnus.gnu-win32@mundook.cs.mu.OZ.AU> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: Tim Newsham Cc: gnu-win32 AT cygnus DOT com On 27-May-1998, Tim Newsham wrote: > > I have a program which is trying to load a dll at runtime. The > program uses LoadLibraryEx to load the library in, then uses GetProcAddress > to get addresses of various entry points (with appropriate cast operations). > This much seems to work properly. I am having problems, however, when > I try to actually call one of the procedures. The stack pointer (esp) > seems to be incorrect after a call to the procedure. In particular > I am passing in 3 4-byte arguments (12 bytes). The emitted code > looks like: > > > call *%ebx > addl %0xc, %esp > > After the call, the stack pointer seems to be off by 12 bytes (too high). > Its as if the called procedure popped the arguments itself, leaving > the stack as it was prior to the caller pushing, and then the caller > also added 12 to the stack pointer to pop the values, after the function > returned. > > Is this analysis correct? Yes, it looks like the called procedure is using the "stdcall" calling convention rather than the default "cdecl" calling convention. > If so, is there some way to tell the compiler that the callee will be > restoring the stack and that the caller shouldn't bother? Yes, use `__attribute__((stdcall))' on the declaration of the function pointer which you use to call the function. See the "function attributes" section in the "C extensions" section of the gcc documentation. -- Fergus Henderson | "I have always known that the pursuit WWW: | of excellence is a lethal habit" PGP: finger fjh AT 128 DOT 250 DOT 37 DOT 3 | -- the last words of T. S. Garp. - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".