in reply to Win32::API - How to call an Imported function with Win32::API::Types ?

Yes. Just pass perl variables (NOT constants!) for each of the parameters.

... my $uname = 'USER1'; my $passw = 'PASS'; my $domain = 'DOMAIN'; ## use constant NICE_OPT_NAME => 128; etc. if you want symblic names my $options = 128 | 16 | 2; my $client; OMDClinetCreate( $uname, $passw, $domain, $options, $client ) or die $^E; ## Add this to your other calls also!.

The whole reason for using teh typedefs is that it allows the module to do the required conversion work for you.


Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail
"Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon
  • Comment on Re: Win32::API - How to call an Imported function with Win32::API::Types ?
  • Download Code

Replies are listed 'Best First'.
Re^2: Win32::API - How to call an Imported function with Win32::API::Types ?
by fx (Pilgrim) on Jul 02, 2004 at 08:26 UTC

    I still can't get it to work with Import. As you suggest, I have tried:

    use strict; use Win32::API; Win32::API::Type->typedef( 'OMDTEXTZ', 'TCHAR'); Win32::API::Type->typedef( 'OMDERROR', 'ULONG'); Win32::API::Type->typedef( 'OMD32U', 'ULONG' ); Win32::API::Type->typedef( 'OMDCLIENT', 'ULONG' ); Win32::API->Import( 'omdapi', 'OMDERROR OMDClientCreate ( OMDTEXTZ* pUsername, OMDTEXTZ* pPassword, OMDTEXTZ* pDomain, OMD32U options, OMDCLIENT* pClient )' ); my $username = 'user1'; my $password = 'pass1'; my $domain = 'domain1'; my $options = 0; my $client; my $return = OMDClientCreate( $username, $password, $domain, $options, + $client ) or die $^E;

    And although the call to OMDClientCreate does not die, it also puts nothing into the $client variable.

    However, if I try it using a parameter list instead:

    use strict; use Win32::API; my $function = Win32::API->new( 'omdapi', 'OMDClientCreate', 'PPPIP', +'I'); my $client = pack('L', 0); my $username = 'user1'; my $password = 'pass1;; my $domain = 'domain1'; my $return = $function->Call( $username, $password, $domain, 0, $clien +t );

    it actually works (which I have confirmed by using Data::Dumper on the $client variable).

    Am I missing something?

    Thanks,

    fx, Infinity is Colourless

      I suspect that the problem is that TCHAR is not a type that Win32::API::Type knows about. You can find the list of those that it does know about at the bottom of the Type.pm source file.

      You probably need to change

      Win32::API::Type->typedef( 'OMDTEXTZ', 'TCHAR');

      to something like

      Win32::API::Type->typedef( 'OMDTEXTZ', 'unsigned char') or die $^E;

      However, if you were to add some error checking to your calls (as above and in my original snippet. E.g. ...or die $^E;), then the module would be telling you what is wrong and where.


      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "Think for yourself!" - Abigail
      "Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon

        According to the source, TCHAR is a valid type which is why I chose it. Hmm...

        As you suggest, I shall put lots of error checking in and see what isn't being liked.

        Thanks,

        fx, Infinity is Colourless