Solved

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

Posted on 2004-10-12
4
534 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 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 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

Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

Question has a verified solution.

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

It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…

738 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