http://qs1969.pair.com?node_id=241138


in reply to Re: Win32::API
in thread Win32::API

as promised (and after a mere 6 months or so :-), I've released version 0.40 of Win32::API.

it may not be on CPAN at the time I write, but here's the link to download it from my site:
Win32-API-0.40.tar.gz

the synopsis I gave in my previous message still applies :-)

there is even support for callbacks, but it is very experimental: feedback is appreciated as always.

cheers,
Aldo

King of Laziness, Wizard of Impatience, Lord of Hubris

Replies are listed 'Best First'.
Re: Re: Win32::API (finally)
by SyN/AcK (Scribe) on Jul 16, 2003 at 04:13 UTC
    Wow man, you must not really be the King of Laziness, cause this is awesome! I really appreciate your work.
Re: Re: Win32::API (finally)
by neauva (Initiate) on Aug 19, 2003 at 22:01 UTC
    Very nice and Very handy package.
    I'm having a problem, however... :-)

    In short, I'm trying to use Win32::API to call CreateProcess.

    All is well except for the LPSTARTUPINFO and LPPROCESS_INFORMATION parms I pass into the call. If I create these using pack(...) for the correct number of bytes, it works fine and I can get the PID back out of the PROCESS_INFORMATION object (my ultimate goal).

    If, however, I create these parms using the Win32::API::Struct->new( 'STARTUPINFO' ) approach, the call fails. I'm even setting the .cb field to the size of the structure. The error I get back (using Win32::GetLastError()) is "Invalid access to memory location". Here's the function call I'm making (same in both cases):

    <-----------snip------------> # version 1 - succeeds my $si = pack( "L17", ((0) x 17) ); $si = pack( "LL16", length( $si ), ((0) x 16 ) ); my $pi = pack( "L4", ((0) x 4 ) ); # version 2 - fails my $si = Win32::API::Struct->new( "STARTUPINFO" ); $si->{cb} = $si->sizeof(); my $pi = Win32::API::Struct->new( "PROCESS_INFORMATION" ); my $retval = CreateProcess( "c:\\winnt\\notepad.exe", 0, # unused - cmdline ptr, unused 0, # unused - proc attributes ptr 0, # unused - thread attributes ptr 0, # unused - inherit handles 0, # unused - creation flags 0, # unused - env pointer 0, # unused - current dir ptr $si, $pi ); <-----------snip------------>
    Should CreateProcess be called the same way in both cases? When a ->new('STARTUPINFO') is called, is the memory zeroed-out upon creation? Any idea why the pack version succeeds and the Struct verion fails?

    TIA!
    D. Smith

      At least part of the problem is that Win32::API::Struct (or rather, Win32::API::Type) does have support for the STARTUPINFO structure, or at least not as of version 0.41 which is the latest version I can find.

      The fact that you aren't receiving the warnings I get:

      Unknown Win32::API::Struct 'STARTUPINFO' at - line 7 Can't call method "sizeof" on an undefined value at - line 8, <DATA> l +ine 164.

      means that either

      • you don't have warnings enabled.

        If so, turn them on, it'll save you much grief:)

      • You have a later version of the package than I have been able to find.

        If so, which version is it and where can I get a copy:)

      • You have a (locally?) modified copy of the package.

        If so, consult the people that made the modifications.


      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller
      If I understand your problem, I can solve it! Of course, the same can be said for you.