6739cf90e4aa3b3344768b8da241802f80ff455cvboxsync/* $Id$ */
46f059bea92bedbd395793702c73946ead235586vboxsync/** @file
46f059bea92bedbd395793702c73946ead235586vboxsync *
46f059bea92bedbd395793702c73946ead235586vboxsync * tstVBoxAPIWin - sample program to illustrate the VirtualBox
46f059bea92bedbd395793702c73946ead235586vboxsync * COM API for machine management on Windows.
46f059bea92bedbd395793702c73946ead235586vboxsync It only uses standard C/C++ and COM semantics,
46f059bea92bedbd395793702c73946ead235586vboxsync * no additional VBox classes/macros/helpers. To
46f059bea92bedbd395793702c73946ead235586vboxsync * make things even easier to follow, only the
46f059bea92bedbd395793702c73946ead235586vboxsync * standard Win32 API has been used. Typically,
46f059bea92bedbd395793702c73946ead235586vboxsync * C++ developers would make use of Microsoft's
46f059bea92bedbd395793702c73946ead235586vboxsync * ATL to ease development.
46f059bea92bedbd395793702c73946ead235586vboxsync */
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync/*
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync * Copyright (C) 2006-2014 Oracle Corporation
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
46f059bea92bedbd395793702c73946ead235586vboxsync */
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync/*
46f059bea92bedbd395793702c73946ead235586vboxsync * PURPOSE OF THIS SAMPLE PROGRAM
46f059bea92bedbd395793702c73946ead235586vboxsync * ------------------------------
46f059bea92bedbd395793702c73946ead235586vboxsync *
46f059bea92bedbd395793702c73946ead235586vboxsync * This sample program is intended to demonstrate the minimal code necessary
46f059bea92bedbd395793702c73946ead235586vboxsync * to use VirtualBox COM API for learning puroses only. The program uses pure
46f059bea92bedbd395793702c73946ead235586vboxsync * Win32 API and doesn't have any extra dependencies to let you better
46f059bea92bedbd395793702c73946ead235586vboxsync * understand what is going on when a client talks to the VirtualBox core
46f059bea92bedbd395793702c73946ead235586vboxsync * using the COM framework.
46f059bea92bedbd395793702c73946ead235586vboxsync *
46f059bea92bedbd395793702c73946ead235586vboxsync * However, if you want to write a real application, it is highly recommended
46f059bea92bedbd395793702c73946ead235586vboxsync * to use our MS COM XPCOM Glue library and helper C++ classes. This way, you
46f059bea92bedbd395793702c73946ead235586vboxsync * will get at least the following benefits:
46f059bea92bedbd395793702c73946ead235586vboxsync *
46f059bea92bedbd395793702c73946ead235586vboxsync * a) better portability: both the MS COM (used on Windows) and XPCOM (used
46f059bea92bedbd395793702c73946ead235586vboxsync * everywhere else) VirtualBox client application from the same source code
46f059bea92bedbd395793702c73946ead235586vboxsync * (including common smart C++ templates for automatic interface pointer
46f059bea92bedbd395793702c73946ead235586vboxsync * reference counter and string data management);
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * b) simpler XPCOM initialization and shutdown (only a single method call
46f059bea92bedbd395793702c73946ead235586vboxsync * that does everything right).
46f059bea92bedbd395793702c73946ead235586vboxsync *
46f059bea92bedbd395793702c73946ead235586vboxsync * Currently, there is no separate sample program that uses the VirtualBox MS
46f059bea92bedbd395793702c73946ead235586vboxsync * COM XPCOM Glue library. Please refer to the sources of stock VirtualBox
46f059bea92bedbd395793702c73946ead235586vboxsync * applications such as the VirtualBox GUI frontend or the VBoxManage command
46f059bea92bedbd395793702c73946ead235586vboxsync * line frontend.
46f059bea92bedbd395793702c73946ead235586vboxsync */
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync#include <stdio.h>
46f059bea92bedbd395793702c73946ead235586vboxsync#include "VirtualBox.h"
46f059bea92bedbd395793702c73946ead235586vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync#define SAFE_RELEASE(x) \
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (x) { \
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync x->Release(); \
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync x = NULL; \
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsyncint listVMs(IVirtualBox *virtualBox)
46f059bea92bedbd395793702c73946ead235586vboxsync{
46f059bea92bedbd395793702c73946ead235586vboxsync HRESULT rc;
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync /*
46f059bea92bedbd395793702c73946ead235586vboxsync * First we have to get a list of all registered VMs
46f059bea92bedbd395793702c73946ead235586vboxsync */
46f059bea92bedbd395793702c73946ead235586vboxsync SAFEARRAY *machinesArray = NULL;
46f059bea92bedbd395793702c73946ead235586vboxsync
1bef0d3fd3b2fe689a4eaa9ebf0647b8bf7c662evboxsync rc = virtualBox->get_Machines(&machinesArray);
46f059bea92bedbd395793702c73946ead235586vboxsync if (SUCCEEDED(rc))
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync IMachine **machines;
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync rc = SafeArrayAccessData(machinesArray, (void **) &machines);
46f059bea92bedbd395793702c73946ead235586vboxsync if (SUCCEEDED(rc))
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync for (ULONG i = 0; i < machinesArray->rgsabound[0].cElements; ++i)
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync BSTR str;
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync rc = machines[i]->get_Name(&str);
46f059bea92bedbd395793702c73946ead235586vboxsync if (SUCCEEDED(rc))
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync printf("Name: %S\n", str);
46f059bea92bedbd395793702c73946ead235586vboxsync SysFreeString(str);
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync SafeArrayUnaccessData(machinesArray);
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync SafeArrayDestroy(machinesArray);
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync return 0;
46f059bea92bedbd395793702c73946ead235586vboxsync}
46f059bea92bedbd395793702c73946ead235586vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsyncint testErrorInfo(IVirtualBox *virtualBox)
46f059bea92bedbd395793702c73946ead235586vboxsync{
46f059bea92bedbd395793702c73946ead235586vboxsync HRESULT rc;
46f059bea92bedbd395793702c73946ead235586vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Try to find a machine that doesn't exist */
46f059bea92bedbd395793702c73946ead235586vboxsync IMachine *machine = NULL;
46f059bea92bedbd395793702c73946ead235586vboxsync BSTR machineName = SysAllocString(L"Foobar");
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync rc = virtualBox->FindMachine(machineName, &machine);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync if (FAILED(rc))
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync IErrorInfo *errorInfo;
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync rc = GetErrorInfo(0, &errorInfo);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync if (FAILED(rc))
46f059bea92bedbd395793702c73946ead235586vboxsync printf("Error getting error info! rc = 0x%x\n", rc);
46f059bea92bedbd395793702c73946ead235586vboxsync else
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync BSTR errorDescription = NULL;
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync rc = errorInfo->GetDescription(&errorDescription);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync if (FAILED(rc) || !errorDescription)
46f059bea92bedbd395793702c73946ead235586vboxsync printf("Error getting error description! rc = 0x%x\n", rc);
46f059bea92bedbd395793702c73946ead235586vboxsync else
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync printf("Successfully retrieved error description: %S\n", errorDescription);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync SysFreeString(errorDescription);
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync errorInfo->Release();
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SAFE_RELEASE(machine);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SysFreeString(machineName);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync return 0;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync}
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsyncint testStartVM(IVirtualBox *virtualBox)
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync{
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync HRESULT rc;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Try to start a VM called "WinXP SP2". */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync IMachine *machine = NULL;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync BSTR machineName = SysAllocString(L"WinXP SP2");
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync rc = virtualBox->FindMachine(machineName, &machine);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (FAILED(rc))
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync IErrorInfo *errorInfo;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync rc = GetErrorInfo(0, &errorInfo);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (FAILED(rc))
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync printf("Error getting error info! rc = 0x%x\n", rc);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync else
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync BSTR errorDescription = NULL;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync rc = errorInfo->GetDescription(&errorDescription);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (FAILED(rc) || !errorDescription)
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync printf("Error getting error description! rc = 0x%x\n", rc);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync else
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync printf("Successfully retrieved error description: %S\n", errorDescription);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SysFreeString(errorDescription);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SAFE_RELEASE(errorInfo);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync else
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync ISession *session = NULL;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync IConsole *console = NULL;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync IProgress *progress = NULL;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync BSTR sessiontype = SysAllocString(L"gui");
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync BSTR guid;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync do
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync rc = machine->get_Id(&guid); /* Get the GUID of the machine. */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (!SUCCEEDED(rc))
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync printf("Error retrieving machine ID! rc = 0x%x\n", rc);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync break;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Create the session object. */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync rc = CoCreateInstance(CLSID_Session, /* the VirtualBox base object */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync NULL, /* no aggregation */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync CLSCTX_INPROC_SERVER, /* the object lives in a server process on this machine */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync IID_ISession, /* IID of the interface */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync (void**)&session);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (!SUCCEEDED(rc))
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync printf("Error creating Session instance! rc = 0x%x\n", rc);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync break;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Start a VM session using the delivered VBox GUI. */
194a8ad893b721dfc22ac5f955671f09db015a3fvboxsync rc = machine->LaunchVMProcess(session, sessiontype,
194a8ad893b721dfc22ac5f955671f09db015a3fvboxsync NULL, &progress);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync if (!SUCCEEDED(rc))
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync printf("Could not open remote session! rc = 0x%x\n", rc);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync break;
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Wait until VM is running. */
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync printf("Starting VM, please wait ...\n");
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync rc = progress->WaitForCompletion(-1);
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Get console object. */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync session->get_Console(&console);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Bring console window to front. */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync machine->ShowConsoleWindow(0);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync printf("Press enter to power off VM and close the session...\n");
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync getchar();
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Power down the machine. */
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync rc = console->PowerDown(&progress);
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync /* Wait until VM is powered down. */
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync printf("Powering off VM, please wait ...\n");
3d9b2bf0cd2b26ada853ec1b9df753d352679a44vboxsync rc = progress->WaitForCompletion(-1);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Close the session. */
825c2485cf84eec495985ffd605a1c9cddee8c32vboxsync rc = session->UnlockMachine();
57134cc31d26d91192e87a4541b4f82fbdb2c297vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync } while (0);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SAFE_RELEASE(console);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SAFE_RELEASE(progress);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SAFE_RELEASE(session);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SysFreeString(guid);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SysFreeString(sessiontype);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync SAFE_RELEASE(machine);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync SysFreeString(machineName);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync return 0;
46f059bea92bedbd395793702c73946ead235586vboxsync}
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsyncint main(int argc, char *argv[])
46f059bea92bedbd395793702c73946ead235586vboxsync{
46f059bea92bedbd395793702c73946ead235586vboxsync HRESULT rc;
46f059bea92bedbd395793702c73946ead235586vboxsync IVirtualBox *virtualBox;
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync do
46f059bea92bedbd395793702c73946ead235586vboxsync {
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Initialize the COM subsystem. */
46f059bea92bedbd395793702c73946ead235586vboxsync CoInitialize(NULL);
46f059bea92bedbd395793702c73946ead235586vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Instantiate the VirtualBox root object. */
46f059bea92bedbd395793702c73946ead235586vboxsync rc = CoCreateInstance(CLSID_VirtualBox, /* the VirtualBox base object */
46f059bea92bedbd395793702c73946ead235586vboxsync NULL, /* no aggregation */
46f059bea92bedbd395793702c73946ead235586vboxsync CLSCTX_LOCAL_SERVER, /* the object lives in a server process on this machine */
46f059bea92bedbd395793702c73946ead235586vboxsync IID_IVirtualBox, /* IID of the interface */
46f059bea92bedbd395793702c73946ead235586vboxsync (void**)&virtualBox);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync if (!SUCCEEDED(rc))
46f059bea92bedbd395793702c73946ead235586vboxsync {
46f059bea92bedbd395793702c73946ead235586vboxsync printf("Error creating VirtualBox instance! rc = 0x%x\n", rc);
46f059bea92bedbd395793702c73946ead235586vboxsync break;
46f059bea92bedbd395793702c73946ead235586vboxsync }
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync listVMs(virtualBox);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync testErrorInfo(virtualBox);
46f059bea92bedbd395793702c73946ead235586vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Enable the following line to get a VM started. */
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync //testStartVM(virtualBox);
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync
df2e37f58f19997178bb9be53867a17509a3a2f9vboxsync /* Release the VirtualBox object. */
46f059bea92bedbd395793702c73946ead235586vboxsync virtualBox->Release();
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync } while (0);
46f059bea92bedbd395793702c73946ead235586vboxsync
46f059bea92bedbd395793702c73946ead235586vboxsync CoUninitialize();
46f059bea92bedbd395793702c73946ead235586vboxsync return 0;
46f059bea92bedbd395793702c73946ead235586vboxsync}
46f059bea92bedbd395793702c73946ead235586vboxsync