Re: P/Invoke of CallBack with char* params: return error



Without seriously tweaking the compiled runtime, you cannot have cdecl
callbacks in .NET. The declaration as you've made it:

typedef void (*SawAPFunction)(char *bssid, char *ssid, int rss,int wep,int
infrMode);

.... is cdecl and not stdcall. At best, your function will be called one
time and then you'll get a popup error afterwards saying something about the
value of ESP not being preserved or something. You'll likely get a GP fault
instead. The *outgoing* cdecl api calls you've declared aren't
showstoppers, since .NET can detect the stack mismatch and correct it ...
but aside from running ILDASM on your compiled app, tweaking the callback to
make it cdecl and recompiling with ILASM, you can't have a cdecl *incoming*
callback.

Robert

"Lionel Reyero" <LionelReyero@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:541DAD87-BB20-4942-91A1-4703CD8328A8@xxxxxxxxxxxxxxxx

Hi there,

I am trying to P/Invoke a DLL able to perform a wifi scan.

There is a poll method to which I have to pass a pointer to a function.
Then
the native code will call back the passed function which has char*
parameters.

I tried to write my P/Invoke (see below) but when I run the application, I
get an exception when the "poll" method is called. The exception has the
following message: Attempted to read or write protected memory. This is
often
an indication that other memory is corrupt.

As far as I read, I am not sure that my "delegate" is correct. I am also
unsure about how I should translate the "char *" in C#.

Your help (and code snipets) will be greatly appreciated! Thanks a lot!

Lionel Reyero

==========================
Here is the .h I want to P/Invoke


#ifndef __COMMON_SPOTTER_H__
#define __COMMON_SPOTTER_H__


typedef void (*SawAPFunction)(char *bssid, char *ssid, int rss,int wep,int
infrMode);

/* returns 0 on success, -1 on failure */
int spotter_init();

void spotter_shutdown();

/* returns 0 on success, -1 on failure */
int spotter_poll(SawAPFunction fn);


#endif /* __COMMON_SPOTTER_H__ */


===============================
Here is the P/Invoke I have done:

public delegate void CallBack(IntPtr bssid, IntPtr ssid, int rss, int
wep, int infrMode);


class Spotter
{

[DllImport("spotter.dll",
EntryPoint="_Java_org_placelab_spotter_WiFiSpotter_spotter_1init@8")]
public static extern int init();

[DllImport("spotter.dll", EntryPoint =
"_Java_org_placelab_spotter_WiFiSpotter_spotter_1shutdown@8")]
public static extern void shutdown();

[DllImport("spotter.dll", EntryPoint =
"_Java_org_placelab_spotter_WiFiSpotter_spotter_1poll@8")]
public static extern int poll(CallBack x);

public static void AP_detected(IntPtr bssid, IntPtr ssid, int rss,
int wep, int infrMode)
{

}
}


.



Relevant Pages

  • Re: Use a dll written in C++ into a C# project
    ... Are you sure that the DLL is copied to the device? ... __cdecl deinit_codecs) ... public static extern int summ ...
    (microsoft.public.dotnet.framework.compactframework)
  • Re: LogonUserA / Impersonation
    ... int resultCode = int.MinValue; ... public static extern int LogonUserA(String lpszUserName, ... > Hello Craig, ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Start with hidden Form
    ... > internal int GetWindowVisibleState(IntPtr hWnd, int iStepX, int iStepY) ... > RECT rc = new RECT; ... > public static extern IntPtr WindowFromPoint( ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Problems using ordinary GDI operations on 32bit Bitmap
    ... public const int transparent = 1; ... public static extern bool AlphaBlend( ... public static extern IntPtr SelectObject ... private void InitializeComponent() ...
    (microsoft.public.win32.programmer.gdi)
  • Re: pinvoke SetCommState Windows CE 5.0
    ... There's either a bug in the DCB returning a bad length or being of the wrong ... public const uint GENERIC_WRITE = 0x40000000; ... int nNumberOfBytesToWrite, ... public static extern Boolean ReadFile(int hFile, ...
    (microsoft.public.dotnet.framework.compactframework)

Loading