While this is true for v1 of the framework, it's no longer the case with v2.
Now, you can specify alternate calling conventions for "delegated"
callbacks.
Willy.
[quoted text, click to view] "Robert Simpson" <rmsimpson@noemail.noemail> wrote in message
news:einBvwdMGHA.3100@tk2msftngp13.phx.gbl...
| 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
|
[quoted text, click to view] | "Lionel Reyero" <LionelReyero@discussions.microsoft.com> wrote in message
| news:541DAD87-BB20-4942-91A1-4703CD8328A8@microsoft.com...
| >
| > 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)
| > {
| >
| > }
| > }
|
|