----- Original Message -----
From: "Marvin Humphrey" <[EMAIL PROTECTED]>
To: <perl-xs@perl.org>
Cc: <[EMAIL PROTECTED]>
Sent: Thursday, September 04, 2008 2:15 AM
Subject: Re: Access a perl dll's function on Win32
[reply cross-posted to Module::Build list; reply-to header set to
perl-xs@perl.org ]
On Sep 3, 2008, at 6:23 AM, Sisyphus wrote:
Basically, if you have a perl dll (by which I mean, eg, the Digest::SHA
dll) and you want to directly access a function from within that dll
using XS or Inline::C, how do you do that ?
The brute-force way is cram function addresses through Perl variables, as
suggested at <http://www.perlmonks.org/?node_id=691174> and described in
the Time::HiRes POD documentation at
<http://perldoc.perl.org/Time/HiRes.html#C-API
Yes - I've used that approach before (with the help of that very same
perlmonks thread) - though only in a proof-of-concept exercise (in which I
also did an XS Boot) and it works beautifully. In this particular instance,
however, I was thinking more of how to access the dll's functionality
*without* recompiling it to include the additional functions that would be
necessary for that approach to work. (Sorry - I should have made that
restriction clearer.)
I think that Jan's suggestion of doing a callback is probably the sane way
to go. I was thinking more in terms of accessing the dll in isolation (ie
without actually loading the module - which would rule out callbacks), but
in reality that's probably a silly condition to be imposing anyway.
I thought it might be fun to try out Reini's idea - and I've got an
Inline::C script all set to go to access a function in the Math::GMPf dll.
(That dll has a function that takes no args and returns an int - which keeps
things really simple for me.) Only problem is I couldn't find a way to get
any useful address information at all using nm, objdump or dumpbin. I was,
of course, able to get the address of _boot_Math__GMPf/boot_Math__GMPf using
GetProcAddress, but that's the only address I could get hold of. No matter
.... it was, after all, just something I was going to try out for the heck
of it ;-)
Thanks guys.
Cheers,
Rob