in reply to Re^4: perl c++ perlembed question
in thread perl c++ perlembed question

Hmm, didn't I just describe that exact scenario?

Replies are listed 'Best First'.
Re^6: perl c++ perlembed question
by syphilis (Archbishop) on Jun 28, 2009 at 06:36 UTC
    didn't I just describe that exact scenario?

    I think you've dealt with a slightly different scenario.
    Both Win32::API and C::DynaLib can load functions from dynamic libraries but, as I (currently) understand it, the op is wanting to load functions from an executable. I don't think those modules can help with that.

    Cheers,
    Rob

      As far as Win32 is concerned, there is very little difference between a .exe and a .dll. If a function in a .exe is exported--they usually aren't but there is not reason why they cannot be--then Win32::API will be able to load and call that function. You just name the .exe inplace of the .dll in the call:

      use Win32::API; my $function = Win32::API->new( 'theExe.exe, 'int foo( int a, int b )', ); $return = $function->Call(3, 2);

      If the .exe in question happened to be the same .exe that is currently running an embedded Perl interpreter, that would work fine too.

      Whether this symmetry holds true for other OSs I have no idea.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        I think it works the same

        You and BrowserUK may well be right - so I thought I'd make use of the snippett BrowserUk provided and change 'power.pl' in the above example to:
        use Win32::API; sub expo { my $function = Win32::API->new( 'power.exe, 'int foo()', ); $return = $function->Call(); print "foo returned $return\n"; my ($a, $b) = @_; return $a ** $b; }
        I realise that foo() may not be exported by my 'power.exe', but thought I might as well give it a try. The output of running 'power.exe' now changes to:
        C:\_32\pscrpt\embed>power Can't load module Win32::API, dynamic loading not available in this pe +rl. (You may need to build a new perl executable which either supports dynamic loading or has the Win32::API module statically linked into +it.) at power.pl line 1 Compilation failed in require at power.pl line 1. BEGIN failed--compilation aborted at power.pl line 1. Undefined subroutine &main::expo called at power.pl line 1.
        I don't normally have any such trouble with Win32::API, so I presume the message is telling me that the embedded perl interpreter is a static one - and I'll either have to link Win32::API statically to it, or embed an interpreter that supports dynamic loading.

        Without knowing what's entailed, it doesn't sound particularly trivial to achieve, and I'm not sure that I really want to pursue it
        :-)

        Cheers,
        Rob