Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

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

Posted on 2004-10-12
4
Medium Priority
?
543 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
  • 2
  • 2
4 Comments
 
LVL 86

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 86

Accepted Solution

by:
Mike Tomlinson earned 200 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

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

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

This article explains how to create and use a custom WaterMark textbox class.  The custom WaterMark textbox class allows you to set the WaterMark Background Color and WaterMark text at design time.   IMAGE OF WATERMARKS STEPS Create VB …
Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
Integration Management Part 2
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …
Suggested Courses
Course of the Month7 days, 17 hours left to enroll

824 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