On 05/16/2012 12:35, bulk 88 wrote:

I would rather not change the dll parameter to a dual purpose ref or non ref, its not 
obvious what the code is doing then. Someone might ask does Win32::API correct 
"unnormalized" dll names now or returns the full path name of the DLL loaded 
from a relative or incomplete name. undef as a dllname is obvious for non-dll func 
pointers there is no dll involved. I looked up what Win32::API::Prototype is. It was last 
and first released in Apr 2001 and it uses the pre C prototype interface of Win32::API. 
It is older than Win32::API 0.40 (Mar 2003) which introduced the C prototype parsing. 
Win32::API::Prototype will continue to work as before under proposed method 1 and method 
2 I posted on perlmonks for non-dll func pointers, it won't get the new feature though. 
From a quick reading of Win32::API::Prototype was a good attempt in 2001 to make 
Win32::API easier to use  but it is throughly obsolete (less types built in than 
Win32::API::Type) and unmaintained (last and only release 20
01, no bug reports ever filed on it on cpan RT). Perhaps you are asking for non-dll func pointers to work with the old pack letter style interface?
_________________
   $function = Win32::API->new(
       undef, 'int 1900000000(int a, int b)',
   );
____________________

That has no beauty and looks confusing since nobody would actually have a
literal number to use.  :)  Most likely you would need to use a sprintf to
create the 2nd arg to the new using the returned addr as the function name.

PS: I have a fair amount of API::Prototype code in use - I like it better
than the API interface but that's just me - if it were bug free, that's
what I would probably use - it's prettier.  :)

That would work with pack letter interface like this,
__________________
   $function = Win32::API->new(
       undef, 1900000000, 'II', 'I',
   );
_____________________

Same with this one except you could probably use the return addr directly
if it's unpacked.

I dont like this approach for the reasons I said on PerlMonks since there is no 
friendly name associated with the function now.
With a tiny bit of work by me
_____________________
   $function = Win32::API->new(
       undef, 1900000000, 'meaninglessName','II', 'I',
   );
____________________
can work too. Is this what you want?

That one would certainly be better than the first two options - you
have to have the name so you can call the function using it.

Possible additional alternatives:

1) create a new method that specifically handles only the new dynamic
function interface and then there is no compatibility issue and it
could call the old Win32::API new with whatever extra hidden parameters
that are needed;

2) use a sub-package - Win32::API::Dynamic or some such could be
created that inherited from Win32::API to handle the new code in a
similar manner.

Mind you, these are only suggestions to possibly help to make it easier
to follow the logic.  It comes down to what you feel comfortable
implementing.  I thought my ref idea was easier to implement even
though it may be a bit convoluted using the DLL arg to do the logic
switching.

Reply via email to