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.

Preguntas similare

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
Respuesta Responder a este mensaje
#2 josuth
05/09/2006 - 11:12 | Informe spam
Hola!

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);




En la declaración efectivamente está declarado como void *, lo que
sucede es que dependiendo del tipo de notificación, por pData llega un
tipo de estructura diferente, y a mi sólo me interesa ese tipo. Cuando
pData no es SIMPBCHANGE, de alguna manera lo encaja, porque no falla
por eso. Creo que ése no era el problema.

Ya lo he "solucionado", es algo rarísimo. El caso es que la
aplicación fallaba cuando tenía puesto algún punto de ruptura!!! Lo
he probado mil veces, si hay breakpoint -> falla, sino lo hay ->
funciona. (??)

No tengo ni idea de por qué sucede esto. Tú tienes alguna?

Gracias por tu respuesta,

Un saludo!
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida