PDA

Ver la Versión Completa : Dll y funciones


mar646
27-04-2005, 12:32:20
Hola a todos. Os explico mi problema a ver si alguien me puede ayudar. Programo en Delphi 5 bajo windows XP. Me he tenido que hacer una dll en visual c++ (MFC) para poder acceder a una capturadora de video. El caso es que dentro de la dll tengo un objeto que hace el tratamiento de la capturadora. Fuera del objeto hay una función que es asociada al objeto y que salta cada vez que la capturadora manda una imagen (no tengo mucha idea de c++ pero supongo que esta función es estática). En delphi no tengo ningún problema en usar las funciones del objeto y todo va perfectamente. El problema es que yo necesito en delphi el poder tratar esa función. He tratado de generar una función (callback) para que salte cada vez que llega la foto pero me da una violación de acceso. Lo que me gustaría es poder tratar esa función en delphi, ya que uno de sus parámetros es un puntero a byte que contiene la imagen de la capturadora.

¿Alguna idea sobre este tema? ¿Puede ser problema de memoria entre la dll y mi aplicación delphi? He visto algo de poder compilar con run-time (ya que la dll y la aplicación usarían el mismo espacio de memoria) ¿Sabéis algo sobre este tema?

De antemano muchas gracias.

delphi.com.ar
27-04-2005, 14:49:38
Sería bueno que subas algo de documentación.. digamos, como pide la DLL que sea la dichosa función de callback!

mar646
27-04-2005, 16:45:40
Perdona por no explicarme bien. Mira: tengo una dll que me dio el fabricante de una capturadora de video. Esta dll tiene la dll en si y un archivo de cabecera en c++ (creo que este tipo de dll hace uso de MFC). No puedo usar directamente esta dll porque contiene una estructura en la que usa la palabra reservada de delphi 'set'. Al ocurrirme esto, pensé en hacer una dll para que me sirva de interfaz entre la del fabricante y mi aplicación. Pues bien, todas la funciones funcionan perfectamente excepto la siguiente:

typedef void ( __cdecl __RPC_FAR *CAPTURECALLBACK )(
DWORD channel,
BYTE __RPC_FAR *pBuffer,
DWORD nBufLen,
BYTE bStatus);

AVSAPI AVSERR AVS_SetCapCallback(CAPTURECALLBACK pCallback);

Esta función, según entiendo yo, se le pasa un puntero a una función con los parámetros definidos en el tipo de arriba. Mi idea es la de asignar una función hecha en delphi para poder controlar esta función. Para ello:

// declaración de tipo (lo de los parámetros al revés es por la documentación de la ayuda de delphi)
Callback = procedure(prStatus: Byte; prBufferLen: DWORD; prBuffer: PByte; prCanal: DWORD); cdecl;
pCallback = ^Callback;

// Definición de la función de la dll
function SetCapCallback(prCallback: pCallback): integer; stdcall;

// Definición de la función en la que quiero tratar la llamada
procedure CapCallBack(prStatus: Byte; prBufferLen: DWORD; prBuffer: PByte; prCanal: DWORD);

// Asignación de la función
SetCapCallback(@CapCallBack);

Una vez hecho esto, me salta la función CapCallBack, pero: 1º. Los parámetros no llegan bien (cosas raras); 2º. Al salir de la función da un error de memoria.

¿Alguna idea? Supongo que no estaré llamando bien a la función o estaré haciendo algo malamente. Gracias.