Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

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?

TIA!
D. Smith


Comment on Re: Re: Win32::API (finally)
Download Code
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?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (10)
As of 2015-07-28 23:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (260 votes), past polls