RE: Callbacks from unmanaged code...

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



In .NET, the calling convention for methods is StdCall. What is the calling
convention for your unmanaged *.dll? I'm assumming it is probably cdecl,
which will cause problems in your managed callback. The stack is probably
being popped one too many times after your call back executes.

You can use the CallingConvention property of the DllImport attribute to
define the calling convention for that method, but I'm not sure if this can
be applied to delegates.

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl )]
public static extern IntPtr Initialize(TNInitializeCallbackType callback);

Not sure if the above code will work for a delegate, but you can give it a
shot. If you have the unmanaged souce code, you can probably create another
method called something like "InitializeStdCall" using the StdCall calling
convention and then in there, call "Initialize". This will act as a wrapper.

Hope this helps or points you in the right direction.

"cada0310" wrote:

Hi there,

I'm new to C# (but not to C++), and I'm trying to create a web service that
calls some of our older software, located in a DLL. I'm getting most the
calls to work ok, but one of them needs a callback into the managed code. I
thought I had it all worked out, but it seems like when the callback is
getting hit, things might be going out of scope and crashing the app.

Here's my little web service function; I hacked out a bunch of other stuff
for brevity, but the general idea is, I call the "Initialize" function,
providing a callback to the DLL so the DLL can call me when certain
operations in the "LoginUser2" complete.

You can see where I tried to keep the callback around in a session object,
but, being a novice, I'm not sure this is the right approach. Essentially, I
need this callback alive for the whole life of the user's session.

[WebMethod(EnableSession = true)]
public string HelloArguments(string sLogin, string sPassword)
{
Test.TNInitializeCallbackType cb = new
Test.TNInitializeCallbackType(Test.TNAPICallback);
Session["Callback"] = cb;

hWho = Test.Initialize(cb);

result2 = Test.LogonUser2(hWho, sLogin, sPassword);

return sResult;
}

and some defs:

class Test
{
[DllImport("mydll.dll")]
public static extern Int32 LogonUser2(IntPtr hWho, string pszLogin,
string pszPassword);

public delegate IntPtr TNInitializeCallbackType(IntPtr hWho, Int32
a1, Int32 a2, Int32 a3);

[DllImport("mydll.dll")]
public static extern IntPtr Initialize(TNInitializeCallbackType
callback);

public static IntPtr TNAPICallback(IntPtr hWho, Int32 a1, Int32 a2,
Int32 a3)
{
return (IntPtr)0;
}

Thanks for any help or pointers as to where I can read up on this.

.



Relevant Pages

  • Re: Marshal callback containing unsigned char * in signature
    ... It is possible to change the calling convention for a callback to __cdecl, ... This is a third party dll that I'm ...
    (microsoft.public.dotnet.framework.interop)
  • Re: Marshal callback containing unsigned char * in signature
    ... What's important is the calling convention used by the callback, ... This is a third party dll that I'm ... >> public delegate void SomeFunctionDelegate ...
    (microsoft.public.dotnet.framework.interop)
  • Native DLL and callback in C++
    ... I'm trying to figure out how some stuff can be done when calling ... handle for the user of the DLL, in this case it's called Test and the ... function and call a function that, in turn, will call the callback ... void setCallback{ ...
    (microsoft.public.dotnet.framework.interop)
  • Re: c# calling unmanaged dll with wrong calling conventions
    ... When calling a vendor-supplied unmanaged win32 dll via C#, ... Given that the vendor is not willing to provide API docs beyond a small, ... usually a result of calling a function declared with one calling ... If I change the calling convention of the imported dll functions from ...
    (microsoft.public.dotnet.framework.interop)
  • c# calling unmanaged dll with wrong calling conventions
    ... When calling a vendor-supplied unmanaged win32 dll via C#, the dll appears to work ok. ... Given that the vendor is not willing to provide API docs beyond a small, one page vb.bas file with declare statements, I decided to write a C program to do some additional testing. ... This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. ...
    (microsoft.public.dotnet.framework.interop)