Funciones externas: método alternativo para usar .dll desde un script C

Esta es una pregunta complementaria paraFunciones externas: cabeceras de referencia en C-script para dll compilado.

Esa pregunta de desbordamiento de pila está utilizando una llamada de función externa de Modelica a un script c. Ese c-script luego usa las funciones c contenidas dentro de un .dll. A continuación se muestra el método preferido inicial que había intentado y un intento de trabajo que no prefiero.

Intento inicial

El siguiente código no funcionaría. Mi suposición fue desde que cargué la biblioteca .dlllibgsl en Modelica, podría simplemente usar encabezados en el script C para usar llamadas de función de ese .dll. Sin embargo, el archivo dslog.txt indicó que no podía reconocergsl_sf_bessel_j0. Aparentemente, el C-script no sabe nada sobre ellibgsl.dll que especifiqué en Modelica.

Función modelica:

function chirp

  input Modelica.SIunits.AngularVelocity w_start;
  input Modelica.SIunits.AngularVelocity w_end;
  input Real A;
  input Real M;
  input Real t;
  output Real u "output signal";

  external "C" u=chirp(w_start,w_end,A,M,t)
    annotation(Library="libgsl", Include="#include \"chirp.c\"");
end chirp;

C-Script:

#include <gsl/gsl_sf_bessel.h>

double chirp2(double w1, double w2, double A, double M, double time)
{
  double res;
  double y;
  res=A*cos(w1*time+(w2-w1)*time*time/(2*M));
  y = gsl_sf_bessel_j0(res);
  return y;
}

Intento de trabajo:

Para usar un .dll en una llamada de función externa usando un script C, encontré que era necesario cargar la biblioteca de forma independiente usandoLoadLibrary mando.

¿Es este método realmente necesario? Esto es mucho más complicado de lo que esperaba que mi intento inicial funcionara donde pensaba que Modelica contenía el "know-how" necesario para cargar el archivo .dll.

Prima: Parece que existe una manera de enviar mensajes de error a Modelica.void ModelicaVFormatError (const char * string, va_list). ¿Conoces un ejemplo de referencia de su uso para poder reemplazar las declaraciones printf que no parecen enviar nada a Modelica?

Función modelica:

function chirp

  input Modelica.SIunits.AngularVelocity w_start;
  input Modelica.SIunits.AngularVelocity w_end;
  input Real A;
  input Real M;
  input Real t;
  input String fileName= Modelica.Utilities.Files.loadResource("modelica://ExternalFuncTest/Resources/Library/libgsl.dll") "Full file name for GSL library";

  output Real u "output signal";

  external "C" u=chirp(w_start,w_end,A,M,t)
    annotation(Include="#include \"chirp.c\""); // <-- Removed Library reference
end chirp;

C-Script:

#include <windows.h>
#include <stdio.h>

typedef double (__cdecl *BESSEL)(const double); 
double chirp3(double w1, double w2, double A, double M, double time, const char* fileName)
{
    HINSTANCE hinstLib; 
    BESSEL bessel_J0; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(fileName); 

     // If the handle is valid, try to get the function address.

    double res;
    double y = 0;

    res=A*cos(w1*time+(w2-w1)*time*time/(2*M));

    if (hinstLib != NULL) 
    { 
        bessel_J0 = (BESSEL) GetProcAddress(hinstLib, "gsl_sf_bessel_j0"); 

        // If the function address is valid, call the function.

        if (NULL != bessel_J0) 
        {
            fRunTimeLinkSuccess = TRUE;
            printf("Success loading library method.\n"); //<-- Alternative to send message back to Modelica log file?
            y = bessel_J0(res);
        } else
        {
            printf("Failed to load library\n"); //<-- Alternative to send message back to Modelica log file?
        }
        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib); 
    } 

    return y;
}

Respuestas a la pregunta(0)

Su respuesta a la pregunta