Punteros a funciones con PInvoke

04/09/2006 - 12:26 por joseatorralba | Informe spam
Hola a todos,

Estoy intentando mapear una función del SDK de Windows Mobile con
pinvoke, pero algo tengo que estar haciendo mal, porque al llamar a
esta función, me tira tanto Visual Studio como el simulador.

La función es:

HRESULT SimInitialize (
DWORD dwFlags,
SIMCALLBACK lpfnCallBack,
DWORD dwParam,
LPHSIM lphSim
);


SIMCALLBACK es un puntero a función de este tipo:

typedef void (*SIMCALLBACK) (
DWORD dwNotifyCode,
const void * pData,
DWORD dwDataSize,
DWORD dwParam
);


He utilizado un delegado para poder pasar la función. El código en C#
es el siguiente:

public class SimWrapper
{
public delegate void SimCallBack(
uint dwNotificationCode, ref SIMPBCHANGE pData,
uint dwDataSize, uint dwParam);

[DllImport("cellcore.dll")]
public static extern IntPtr SimInitialize(IntPtr dwFlags,
SimCallBack lpfnCallBack,
IntPtr dwParam, out IntPtr lphSim);
}


Luego la llamada a SimInitialize es así:

private static SimWrapper.SimCallBack callBackFunc new SimWrapper.SimCallBack(this.CallBack);

IntPtr s = SimWrapper.SimInitialize(0x00000001,
callBackFunc,
IntPtr.Zero, out hSim);


Si mapeo la función pasando un IntPtr al parámetro SIMCALLBACK, no
tengo ningún problema. Pero el caso es que necesito pasar
correctamente ese parámetro para poder capturar las llamadas a la
función de callback. Actualmente, cuando se ejecuta SimInitialize,
ocurre un error y se cierra el VS y el simulador se queda colgado.

Estoy trabajando con Visual Studio 2005 y la versión 2.0 del Compact
Framework.

A ver si alguien puede echarme una mano.

Un saludo y gracias.
 

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
05/09/2006 - 05:39 | Informe spam
En la declaracion original pData esta declarado como void *, mientras que en
tu declaracion lo declaras como SIMPBCHANGE. Puede que ese sea el problema
si es que la data pasada al callback no corresponde al tipo SIMPBCHANGE.
Prueba cambiarlo por:

public delegate void SimCallBack(uint dwNotificationCode, IntPtr pData, uint
dwDataSize, uint dwParam);

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C

Preguntas similares