Frage

Ok, das ist eine sehr interessante Frage, und es kann nicht eine einfache Möglichkeit, dies zu tun, aber dachte, ich würde dies dort werfen, bevor sie entscheidet, dass Perl Modifizierung ist meine zugrunde liegende Antwort.

So habe ich eine C-Anwendung, die Perl-Skripten in einem eingebetteten Mode nennt. Das alles funktioniert gut und schön und es ist ziemlich genial, dass ich Informationen in und erhalten Informationen wieder heraus gelangen kann. Aber jetzt auf meine nächste Eroberung; Ich brauche meine Embedded-Skript (n) zu erlauben, einige Funktionen innerhalb der C-Anwendung in der Lage sein zu rufen, dass sie ursprünglich genannt.

Dies ist wichtig, weil XSUB es erfordern würde eine externe Bibliothek sein; aber ich will nicht, dass es eine externe Bibliothek sein, ich will es einen direkten Aufruf der C-Funktion (en) sein. Nun, vielleicht kann dies über XSUB getan werden, und ich habe gerade gelesen, und es falsch zu verstehen.

Application -(run)-> Perl

Application <-(function_x())- Perl

Application -(returnfunction_x)-> Perl

Der Grund, dies nicht eine externe Bibliothek sein, weil ich auf Daten verlasse mich, die in der Anwendung ausschließlich erstellt / gespeichert wird.

War es hilfreich?

Lösung

XSUBs erfordert eigentlich nicht, dass es eine externe Bibliothek. Sie bieten lediglich die Möglichkeit, eine C-Funktion von Perl-Raum zu nennen, und bieten einen gewissen Komfort in Abbildung der Aufrufkonventionen zwischen C und Perl.

Alles, was Sie tun müssen, ist XSUBs registrieren Sie in die Einbettung Anwendung mit dem Perl-Interpreter kompiliert Sie sind Einbettung.

#include "XSUB.h"

XS(XS_some_func);
XS(XS_some_func)
{
    dXSARGS;
    char *str_from_perl, *str_from_c;

    /* get SV*s from the stack usign ST(x) and friends, do stuff to them */
    str_from_perl = SvPV_nolen(ST(0));

    /* do your c thing calling back to your application, or whatever */
    str_from_c = some_c_func(str_from_perl);

    /* pack up the c retval into an sv again and return it on the stack */
    mXPUSHp(c_str);
    XSRETURN(1);
}

/* register the above XSUB with the perl interpreter after creating it */
newXS("Some::Perl::function", XS_some_func, __FILE__);

Wenn Perl einbetten, diese Art der Sache ist in der Regel in der xs_init Funktion, die Sie parse_perl passieren getan.

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);

static void
xs_init (pTHX)
{
    newXS("Some::Perl::function", XS_some_func, __FILE__);
    /* possibly also boot DynaLoader and friends. perlembed has more
     * details on this, and ExtUtils::Embed helps as well. */
    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
}

perl_parse(my_perl, xs_init, argc, my_argv, NULL);

Danach werden Sie auch auf die XSUB als Some::Perl::function von Perl-Raum nennen, und dass XSUB wiederum frei in irgendeiner Weise auf Ihre Bewerbung um einen Rückruf es will.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top