una programas parametros llamar funciones funcion ejemplos con como comandos codigos c++ delphi dll delphi-7

c++ - programas - funciones en c ejemplos



Llamar a una funciĆ³n de devoluciĆ³n de llamada en Delphi desde una DLL de C++ (1)

Tengo una DLL de C ++ que escribí que tiene una sola función expuesta, que toma un puntero de función (función de devolución de llamada) como parámetro.

#define DllExport extern "C" __declspec( dllexport ) DllExport bool RegisterCallbackGetProperty( bool (*GetProperty)( UINT object_type, UINT object_instnace, UINT property_identifer, UINT device_identifier, float * value ) ) { // Do something. }

Quiero poder llamar a esta función expuesta de C ++ DLL desde una aplicación Delphi y registrar la función de devolución de llamada para usarla en el futuro. Pero no estoy seguro de cómo hacer un puntero a función en Delphi que funcione con la función DLL C ++ expuesta.

Tengo la aplicación Delphi llamando a una simple función expuesta de c ++ DLL desde la ayuda que obtuve en esta pregunta.

Estoy construyendo la DLL C ++ y puedo cambiar sus parámetros si es necesario.

Mis preguntas son:

  • Cómo crear un puntero a función en Delphi
  • Cómo invoco correctamente la función expuesta de C ++ DLL desde una aplicación Delphi para que la función DLL de C ++ pueda usar el puntero de función.

Declare un puntero de función en Delphi declarando un tipo de función. Por ejemplo, el tipo de función para su devolución de llamada podría definirse así:

type TGetProperty = function(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean; cdecl;

Tenga en cuenta que la convención de llamadas es cdecl porque su código C ++ no especificó ninguna convención de llamadas, y cdecl es la convención de llamadas predeterminada habitual para los compiladores de C ++.

Luego puede usar ese tipo para definir la función DLL:

function RegisterCallbackGetProperty(GetProperty: TGetProperty): Boolean; cdecl; external ''dllname'';

Reemplace ''dllname'' con el nombre de su DLL.

Para llamar a la función DLL, primero debe tener una función Delphi con una firma que coincida con el tipo de devolución de llamada. Por ejemplo:

function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl; begin Result := False; end;

Luego puede llamar a la función DLL y pasar la devolución de llamada como lo haría con cualquier otra variable:

RegisterCallbackGetProperty(Callback);