Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re: Re: Win32::API (finally)

by neauva (Initiate)
on Aug 19, 2003 at 22:01 UTC ( #285057=note: print w/replies, xml ) Need Help??

in reply to Re: Win32::API (finally)
in thread Win32::API

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?

D. Smith

Replies are listed 'Best First'.
Re: Re: Re: Win32::API (finally)
by BrowserUk (Pope) on Aug 20, 2003 at 00:09 UTC

    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.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://285057]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (3)
As of 2021-12-04 02:19 GMT
Find Nodes?
    Voting Booth?
    R or B?

    Results (30 votes). Check out past polls.