func (g *Guest) RunProgram(path, args string, options RunProgramOption) (uint64, int, int, error) {
	var jobHandle C.VixHandle = C.VIX_INVALID_HANDLE
	var err C.VixError = C.VIX_OK
	var pid *C.uint64
	var elapsedtime *C.int
	var exitCode *C.int

	cpath := C.CString(path)
	cargs := C.CString(args)
	defer C.free(unsafe.Pointer(cpath))
	defer C.free(unsafe.Pointer(cargs))

	jobHandle = C.VixVM_RunProgramInGuest(g.handle,
		cpath, //guestProgramName
		cargs, //commandLineArgs
		C.VixRunProgramOptions(options), //options
		C.VIX_INVALID_HANDLE,            //propertyListHandle
		nil,                             // callbackProc
		nil)                             // clientData

	defer C.Vix_ReleaseHandle(jobHandle)

	err = C.get_program_output(jobHandle, pid, elapsedtime, exitCode)

	if C.VIX_OK != err {
		return 0, 0, 0, &Error{
			Operation: "guest.RunProgram",
			Code:      int(err & 0xFFFF),
			Text:      C.GoString(C.Vix_GetErrorText(err, nil)),
		}
	}

	return uint64(*pid), int(*elapsedtime), int(*exitCode), nil
}
func (g *Guest) RunProgram(path, args string, options RunProgramOption) (uint64, int, int, error) {
	var jobHandle C.VixHandle = C.VIX_INVALID_HANDLE
	var err C.VixError = C.VIX_OK
	var pid *C.uint64
	var elapsedtime *C.int
	var exitCode *C.int

	cpath := C.CString(path)
	cargs := C.CString(args)
	defer C.free(unsafe.Pointer(cpath))
	defer C.free(unsafe.Pointer(cargs))

	jobHandle = C.VixVM_RunProgramInGuest(g.handle,
		cpath, //guestProgramName
		cargs, //commandLineArgs
		C.VixRunProgramOptions(options), //options
		C.VIX_INVALID_HANDLE,            //propertyListHandle
		nil,                             // callbackProc
		nil)                             // clientData

	defer C.Vix_ReleaseHandle(jobHandle)

	err = C.get_program_output(jobHandle, pid, elapsedtime, exitCode)

	if C.VIX_OK != err {
		return 0, 0, 0, &Error{
			Operation: "guest.RunProgram",
			Code:      int(err & 0xFFFF),
			Text:      C.GoString(C.Vix_GetErrorText(err, nil)),
		}
	}

	return uint64(*pid), int(*elapsedtime), int(*exitCode), nil
}
// RunProgram runs a program in the guest operating system.
// The program must be stored on a file system available to the guest
// before calling this function.
//
// Parameters:
//
//   path: The path name of an executable file on the guest operating system.
//   args: A string to be passed as command line arguments to the executable.
//   options: Run options for the program. See the remarks below.
//
// Remarks:
//
//   * This function runs a program in the guest operating system.
//     The program must be stored on a file system available to the guest
//     before calling this function.
//
//   * The current working directory for the program in the guest is not defined.
//     Absolute paths should be used for files in the guest, including
//     command-line arguments.
//
//   * If the program to run in the guest is intended to be visible to the user
//     in the guest, such as an application with a graphical user interface,
//     you must call VM.LoginInGuest() with
//     LOGIN_IN_GUEST_REQUIRE_INTERACTIVE_ENVIRONMENT as the option before calling
//     this function. This will ensure that the program is run within a
//     graphical session that is visible to the user.
//
//   * If the options parameter is RUNPROGRAM_WAIT, this function will block and
//     return only when the program exits in the guest operating system.
//     Alternatively, you can pass RUNPROGRAM_RETURN_IMMEDIATELY as the value of
//     the options parameter, and this function will return as soon as the program
//     starts in the guest.
//
//   * For Windows guest operating systems, when running a program with a
//     graphical user interface, you can pass RUNPROGRAM_ACTIVATE_WINDOW as the
//     value of the options parameter. This option will ensure that the
//     application's window is visible and not minimized on the guest's screen.
//     This can be combined with the RUNPROGRAM_RETURN_IMMEDIATELY flag using
//     the bitwise inclusive OR operator (|). RUNPROGRAM_ACTIVATE_WINDOW
//     has no effect on Linux guest operating systems.
//
//   * On a Linux guest operating system, if you are running a program with a
//     graphical user interface, it must know what X Windows display to use,
//     for example host:0.0, so it can make the program visible on that display.
//     Do this by passing the -display argument to the program, if it supports
//     that argument, or by setting the DISPLAY environment variable on the guest.
//     See documentation on VM.WriteVariable()
//
//   * This functions returns three parameters:
//     PROCESS_ID: the process id; however, if the guest has
//     an older version of Tools (those released with Workstation 6 and earlier)
//     and the RUNPROGRAM_RETURN_IMMEDIATELY flag is used, then the process ID
//     will not be returned from the guest and this property will be 0
//     ELAPSED_TIME: the process elapsed time in seconds;
//     EXIT_CODE: the process exit code.
//     If the option parameter is RUNPROGRAM_RETURN_IMMEDIATELY, the latter two
//     will both be 0.
//
//   * Depending on the behavior of the guest operating system, there may be a
//     short delay after the job completes before the process is visible in the
//     guest operating system. Sometimes you may want to use a goroutine to not
//     block your app while this finishes.
//
// Since VMware Server 1.0
// Minimum Supported Guest OS: Microsoft Windows NT Series, Linux