Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

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 ( [id://371330] : note . print w/replies, xml ) Need Help??


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

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

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

    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

        Ok, I've just added ...or die $^E to every Win32::API module call and nothing is die'ing. As far as I can see the call to the function inside the DLL is actually working

        Hmm...

        fx, Infinity is Colourless