VirtualBox

source: vbox/trunk/src/VBox/Main/testcase/tstVBoxAPIWin.cpp@ 9008

Last change on this file since 9008 was 8155, checked in by vboxsync, 17 years ago

The Big Sun Rebranding Header Change

File size: 5.4 KB
Line 
1/** @file
2 *
3 * tstVBoxAPIWin - sample program to illustrate the VirtualBox
4 * COM API for machine management on Windows.
5 It only uses standard C/C++ and COM semantics,
6 * no additional VBox classes/macros/helpers. To
7 * make things even easier to follow, only the
8 * standard Win32 API has been used. Typically,
9 * C++ developers would make use of Microsoft's
10 * ATL to ease development.
11 */
12
13/*
14 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
15 *
16 * This file is part of VirtualBox Open Source Edition (OSE), as
17 * available from http://www.virtualbox.org. This file is free software;
18 * you can redistribute it and/or modify it under the terms of the GNU
19 * General Public License (GPL) as published by the Free Software
20 * Foundation, in version 2 as it comes in the "COPYING" file of the
21 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
22 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
23 *
24 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
25 * Clara, CA 95054 USA or visit http://www.sun.com if you need
26 * additional information or have any questions.
27 */
28
29/*
30 * PURPOSE OF THIS SAMPLE PROGRAM
31 * ------------------------------
32 *
33 * This sample program is intended to demonstrate the minimal code necessary
34 * to use VirtualBox COM API for learning puroses only. The program uses pure
35 * Win32 API and doesn't have any extra dependencies to let you better
36 * understand what is going on when a client talks to the VirtualBox core
37 * using the COM framework.
38 *
39 * However, if you want to write a real application, it is highly recommended
40 * to use our MS COM XPCOM Glue library and helper C++ classes. This way, you
41 * will get at least the following benefits:
42 *
43 * a) better portability: both the MS COM (used on Windows) and XPCOM (used
44 * everywhere else) VirtualBox client application from the same source code
45 * (including common smart C++ templates for automatic interface pointer
46 * reference counter and string data management);
47 * b) simpler XPCOM initialization and shutdown (only a signle method call
48 * that does everything right).
49 *
50 * Currently, there is no separate sample program that uses the VirtualBox MS
51 * COM XPCOM Glue library. Please refer to the sources of stock VirtualBox
52 * applications such as the VirtualBox GUI frontend or the VBoxManage command
53 * line frontend.
54 */
55
56
57#include <stdio.h>
58#include "VirtualBox.h"
59
60
61int listVMs(IVirtualBox *virtualBox)
62{
63 HRESULT rc;
64
65 /*
66 * First we have to get a list of all registered VMs
67 */
68 SAFEARRAY *machinesArray = NULL;
69
70 rc = virtualBox->get_Machines2(&machinesArray);
71 if (SUCCEEDED(rc))
72 {
73 IMachine **machines;
74 rc = SafeArrayAccessData (machinesArray, (void **) &machines);
75 if (SUCCEEDED(rc))
76 {
77 for (ULONG i = 0; i < machinesArray->rgsabound[0].cElements; ++i)
78 {
79 BSTR str;
80
81 rc = machines[i]->get_Name(&str);
82 if (SUCCEEDED(rc))
83 {
84 printf("Name: %S\n", str);
85 SysFreeString(str);
86 }
87 }
88
89 SafeArrayUnaccessData (machinesArray);
90 }
91
92 SafeArrayDestroy (machinesArray);
93 }
94
95 return 0;
96}
97
98int testErrorInfo(IVirtualBox *virtualBox)
99{
100 HRESULT rc;
101
102 /* try to find a machine that doesn't exist */
103 IMachine *machine = NULL;
104 BSTR machineName = SysAllocString(L"Foobar");
105
106 rc = virtualBox->FindMachine(machineName, &machine);
107
108 if (FAILED(rc))
109 {
110 IErrorInfo *errorInfo;
111
112 rc = GetErrorInfo(0, &errorInfo);
113
114 if (FAILED(rc))
115 printf("Error getting error info! rc = 0x%x\n", rc);
116 else
117 {
118 BSTR errorDescription = NULL;
119
120 rc = errorInfo->GetDescription(&errorDescription);
121
122 if (FAILED(rc) || !errorDescription)
123 printf("Error getting error description! rc = 0x%x\n", rc);
124 else
125 {
126 printf("Successfully retrieved error description: %S\n", errorDescription);
127
128 SysFreeString(errorDescription);
129 }
130
131 errorInfo->Release();
132 }
133 }
134
135 if (machine)
136 machine->Release();
137
138 SysFreeString(machineName);
139
140 return 0;
141}
142
143
144int main(int argc, char *argv[])
145{
146 HRESULT rc;
147 IVirtualBox *virtualBox;
148
149 do
150 {
151 /* initialize the COM subsystem */
152 CoInitialize(NULL);
153
154 /* instantiate the VirtualBox root object */
155 rc = CoCreateInstance(CLSID_VirtualBox, /* the VirtualBox base object */
156 NULL, /* no aggregation */
157 CLSCTX_LOCAL_SERVER, /* the object lives in a server process on this machine */
158 IID_IVirtualBox, /* IID of the interface */
159 (void**)&virtualBox);
160
161 if (!SUCCEEDED(rc))
162 {
163 printf("Error creating VirtualBox instance! rc = 0x%x\n", rc);
164 break;
165 }
166
167 listVMs(virtualBox);
168
169 testErrorInfo(virtualBox);
170
171 /* release the VirtualBox object */
172 virtualBox->Release();
173
174 } while (0);
175
176 CoUninitialize();
177 return 0;
178}
179
180
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette