Juan,

Thanks for the info.  It helped me find the answer.  The problem was not
with the calling convention when I called the DLL method but when the DLL
called my callback.  C# delegates only support StdCall calling convention
and the DLL was trying to call my callback using Cdecl.  So I had to change
the typedef of the function pointer to include the CALLBACK macro.  Works
like a charm now.

A good link regarding this is:
http://www.dotnet247.com/247reference/msgs/25/128790.aspx

Russ

At 07:52 PM 7/21/2003 -0300, you wrote:
Hi!
  Are you registering the function with DllImport attribute? Try setting the
calling convention of
this attribute.

To use Cdecl:
[DllImport("DllName.dll", CallingConvention = CallingConvention.Cdecl)]

To use Stdcall:
[DllImport("DllName.dll", CallingConvention = CallingConvention.StdCall)]

Try with one or another.

Juan Wajnerman

-----Original Message-----
From: Moderated discussion of advanced .NET topics.
[mailto:[EMAIL PROTECTED] On Behalf Of Russell McClure
Sent: Monday, July 21, 2003 4:09 PM
To: [EMAIL PROTECTED]
Subject: [ADVANCED-DOTNET] P/Invoke question


I am trying to call a C++ function in a regular Win32 DLL with the following signature:

bool MyFunc
(
     void               **ppSER,
     void               **ppVoid,
     bool                 bSetting
)

The first function is a callback function which I seem to be passing
correctly because it does get invoked.  The second parameter gets passed to
the callback as one of its parameters (defined as void*).

The C++ code that uses this function passes the second parameter as:
(void**)(this)

I am using C# and everything works execpt I don't know what to pass for the
second parameter.  I first defined it as an IntPtr and passed this.Handle.
Doing that the callback was actually called but on return I got this error:
"Run-Time Check Failure #0 - The value of ESP was not properly saved across
a function call.  This is usually a result of calling a function declared
with one calling convention with a function pointer declared with a
different calling convention."

I assume that it is the second parameter that is screwing things up since
the first one (void **ppSER) is the callback and it is being invoked and the
third parameter (bool bSetting) is obviously OK.

So my question boils down to: does anyone know the C# equivalent of the C++
(void**)(this)?

Thanks.

Russ

Reply via email to