Solved

VB.NET error using "createProcess" api call "Object reference not set to an instance of an object"

Posted on 2004-10-12
4
532 Views
Last Modified: 2008-01-09
Hi

I am having a problem calling the api function "CreateProcess" to open another executable.  I brought this module from vb6 where everything worked fine.  I'm sure its something i missed.  Below is the .net code i am using.  See the "StartProcess" function at the end.

Thanks in advance




Imports System.Runtime.InteropServices

Module modProcesses


    Structure PROCESS_INFORMATION
        Dim hProcess As Int32
        Dim hThread As Int32
        Dim dwProcessId As Int32
        Dim dwThreadId As Int32
    End Structure

    Structure STARTUPINFO
        Dim cb As Int32
        Dim lpReserved As Long
        Dim lpDesktop As Long
        Dim lpTitle As Long
        Dim dwX As Int32
        Dim dwY As Int32
        Dim dwXSize As Int32
        Dim dwYSize As Int32
        Dim dwXCountChars As Int32
        Dim dwYCountChars As Int32
        Dim dwFillAttribute As Int32
        Dim dwFlags As Int32
        Dim wShowWindow As Int16
        Dim cbReserved2 As Int16
        Dim lpReserved2 As Byte
        Dim hStdInput As Int32
        Dim hStdOutput As Int32
        Dim hStdError As Int32
    End Structure



    'Shell Constants
    Public Const NORMAL_PRIORITY_CLASS As Long = &H20&
    Public Const INFINITE As Long = -1&

    Public Const STATUS_WAIT_0 As Long = &H0
    Public Const WAIT_OBJECT_0 As Long = STATUS_WAIT_0


    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function InputIdle Lib "user32" Alias "WaitForInputIdle" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Auto Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Int32, ByVal lpThreadAttributes As Int32, _
                                    ByVal bInheritHandles As Int32, ByVal dwCreationFlags As Int32, ByVal lpEnvironment As Int32, ByVal lpCurrentDirectory As Int32, _
                                    ByVal lpStartupInfo As STARTUPINFO, _
                                    ByVal lpProcessInformation As PROCESS_INFORMATION) As Int32

    Public Function SyncShell(ByVal CommandLine As String, Optional ByVal Timeout As Long = 0, Optional ByVal WaitForInputIdle As Boolean = False, Optional ByVal Hide As Boolean = False) As Boolean
        Dim hProcess As Long
        Dim ret As Long
        Dim nMilliseconds As Long

        If Timeout > 0 Then
            nMilliseconds = Timeout
        Else
            nMilliseconds = INFINITE
        End If

        hProcess = StartProcess(CommandLine, Hide)

        If WaitForInputIdle Then
            'Wait for the shelled application to finish setting up its UI:
            ret = InputIdle(hProcess, nMilliseconds)
        Else
            'Wait for the shelled application to terminate:
            ret = WaitForSingleObject(hProcess, nMilliseconds)
        End If
        CloseHandle(hProcess)

        SyncShell = (ret = WAIT_OBJECT_0)
    End Function


    Private Function StartProcess(ByVal CommandLine As String, Optional ByVal Hide As Boolean = False) As Long
        Const STARTF_USESHOWWINDOW As Long = &H1
        Const SW_HIDE As Long = 0

        Dim proc As New PROCESS_INFORMATION
        Dim Start As New STARTUPINFO
        Dim retval As Int32



        'Initialize the STARTUPINFO structure:
        Start.cb = Len(Start)
        If Hide Then
            Start.dwFlags = STARTF_USESHOWWINDOW
            Start.wShowWindow = SW_HIDE
        End If

       
       '***************error on this line "Object reference not set to an instance of an object"
        retval = CreateProcessA("test", CommandLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)

        StartProcess = proc.hProcess
    End Function




End Module
0
Comment
Question by:joesmow
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
4 Comments
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 12293176
Hi joesmow,

Did you know you can get all of that functionality in just a couple lines of code using .Nets Process class?  Here are some code snippets:

        Dim myProcess As New Process
        Dim myStartInfo As New ProcessStartInfo("notepad.exe")

        myStartInfo.WindowStyle = ProcessWindowStyle.Hidden

        myProcess.Start(myStartInfo)

        myProcess.WaitForInputIdle() ' wait infinitely for idle state
        myProcess.WaitForInputIdle(5000) ' wait 5 seconds for idle state

        myProcess.WaitForExit() ' wait infinitely for exit
        myProcess.WaitForExit(5000) ' wait 5 seconds for exit

~IM
0
 

Author Comment

by:joesmow
ID: 12293266
no, i didn't know that, thanks for telling me about it.

i have one problem with it though. i am using the following  and i get an error "No Process is associated with this object" when i call "myProcess.WaitForExit()".  Any ideas why, i know the process is still running because it is sitting on a yes/no/quit prompt

 Dim myProcess As New Process
         
            Dim myStartInfo As New ProcessStartInfo(Application.StartupPath & "\CabArc.exe", "x " & """" & Application.StartupPath & "\" & FileName & """")
            myStartInfo.WindowStyle = ProcessWindowStyle.Normal

            myProcess.Start(myStartInfo)

            myProcess.WaitForExit()
0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 50 total points
ID: 12293597
Try it this way instead:

        Dim myProcess As New Process
        myProcess.StartInfo.FileName = Application.StartupPath & "\CabArc.exe"
        myProcess.StartInfo.Arguments = "x " & """" & Application.StartupPath & "\" & FileName & """"
        myProcess.Start()
        myProcess.WaitForExit()
        MsgBox("Done")

~IM
0
 

Author Comment

by:joesmow
ID: 12293629
thanks alot IM

If you know of any good links to find out about .net classes that make api calls such as this one unnecessary i would appreciate it.

Thanks again for the quick answer
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Article by: jpaulino
XML Literals are a great way to handle XML files and the community doesn’t use it as much as it should.  An XML Literal is like a String (http://msdn.microsoft.com/en-us/library/system.string.aspx) Literal, only instead of starting and ending with w…
A while ago, I was working on a Windows Forms application and I needed a special label control with reflection (glass) effect to show some titles in a stylish way. I've always enjoyed working with graphics, but it's never too clever to re-invent …
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…
Are you ready to implement Active Directory best practices without reading 300+ pages? You're in luck. In this webinar hosted by Skyport Systems, you gain insight into Microsoft's latest comprehensive guide, with tips on the best and easiest way…

756 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question