Punteros C#

02/05/2009 - 11:09 por Mythox | Informe spam
Hola:

Tengo que hacer una integracion desde C# con una libreria de C++ y tengo
algunos problemas con las conversiones de tipos, los punteros y otras cosas
que la verdad me suenan un poco a chino :(

En el archivo sdk.h tengo esta declaracion:

typedef void (__stdcall iidk_frame_callback_func)(int Chan,const char*
m_sFileId,int nCurrentFrame,int nTotalFrames,byte *pImage,int nWidth,int
nHeight,SYSTEMTIME &sysTime,unsigned long user_param);
typedef void (__stdcall iidk_callback_func)(const char* msg,const char*
slave_id,unsigned long user_param);
typedef void (__stdcall iidk_old_func)(const char* msg) ;
IIDK_API BOOL __stdcall Connect4(LPCTSTR ip, LPCTSTR port, LPCTSTR id,
iidk_callback_func* lpfunc,
iidk_frame_callback_func* lpframe_func,
iidk_user_data_func* iidk_user_data_func,
DWORD user_param,int async_connect,DWORD connect_attempts);

Bien, ahora lo quiero llamar desde mi aplicacion, con este codigo:

public delegate void OnMensajeNuevo(string msg,string slave_id,ulong
user_param);
public delegate void OnFrameVideo(int Chan,string m_sFieldId,int
nCurrentFrame,int nTotalFrames,byte pImage,int nWidth,int nHeight,DateTime
sysTime,ulong user_param);
public delegate void OnUserData(int nIdent, byte pBuffer, int dwSize, ulong
user_param);

OnMensajeNuevo onMensajeNuevo = new OnMensajeNuevo(NuevoMensajeNuevo);
OnFrameVideo onFrameVideo = new OnFrameVideo(FrameVideo);
OnUserData onUserData = new OnUserData(UserData);

[DllImport("sdk.dll")]
public static extern bool Connect4(string ip,string port,string id,
OnMensajeNuevo OnMensaje,OnFrameVideo OnFrame,OnUserData
OnUserData,int user_param,int async_connect,int connect_attempts);

Implemento los metodos correspondientes para los delegados y en la llamada a
Connect4 los paso como parametros, conecta bien y funciona, pero no recibo
los eventos a traves de los delegados.

Creo que el problema son los esteriscos de la declaración en C++, son
punteros, he estado leyendo y he probado a implentarlos en C# con "unsafe"
pero no he podido ...

¿Como tengo que hacer la declaración en C# para que funcione? ¿Creeis que el
problema son los *?

Gracias.
 

Leer las respuestas

#1 Alberto Poblacion
02/05/2009 - 13:25 | Informe spam
"Mythox" wrote in message
news:
[...]
IIDK_API BOOL __stdcall Connect4(LPCTSTR ip, LPCTSTR port, LPCTSTR id,
iidk_callback_func* lpfunc,
iidk_frame_callback_func* lpframe_func,
iidk_user_data_func* iidk_user_data_func,
DWORD user_param,int async_connect,DWORD connect_attempts);

[...]
Implemento los metodos correspondientes para los delegados y en la llamada
a Connect4 los paso como parametros, conecta bien y funciona, pero no
recibo los eventos a traves de los delegados.

Creo que el problema son los esteriscos de la declaración en C++, son
punteros, he estado leyendo y he probado a implentarlos en C# con "unsafe"
pero no he podido ...

¿Como tengo que hacer la declaración en C# para que funcione? ¿Creeis que
el problema son los *?



No, el problema no debería estar ahi. Los asteriscos se usan para indicar
que hay que pasar un puntero a una función. En .Net, el equivalente a un
puntero a función es un delegado, y el Interop Marshaller en teoría debería
convertirlo correctamente. Para cerciorarte de que el Marshaller está
realizando la conversión necesaria, puedes especificárselo mediante un
atributo MarshallAs:

[DllImport("sdk.dll")]
public static extern bool Connect4(string ip,string port,string id,
[MarshalAs(UnmanagedType.FunctionPtr)] OnMensajeNuevo OnMensaje,
[MarshalAs(UnmanagedType.FunctionPtr)] OnFrameVideo OnFrame,
[MarshalAs(UnmanagedType.FunctionPtr)] OnUserData OnUserData,
int user_param,int async_connect,int connect_attempts);

Preguntas similares