VirtualBox

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

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

Main/XPCOM: Sorted out the XPCOM glue library usage: the standalone glue library is not used anymore (and should never be used when linking to the shared XPCOM library directly). This finally solved XPCOM symbol conflicts & mixups.

File size: 5.5 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 innotek GmbH
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 as published by the Free Software Foundation,
20 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
21 * distribution. VirtualBox OSE is distributed in the hope that it will
22 * be useful, but WITHOUT ANY WARRANTY of any kind.
23 */
24
25/*
26 * PURPOSE OF THIS SAMPLE PROGRAM
27 * ------------------------------
28 *
29 * This sample program is intended to demonstrate the minimal code necessary
30 * to use VirtualBox COM API for learning puroses only. The program uses pure
31 * Win32 API and doesn't have any extra dependencies to let you better
32 * understand what is going on when a client talks to the VirtualBox core
33 * using the COM framework.
34 *
35 * However, if you want to write a real application, it is highly recommended
36 * to use our MS COM XPCOM Glue library and helper C++ classes. This way, you
37 * will get at least the following benefits:
38 *
39 * a) better portability: both the MS COM (used on Windows) and XPCOM (used
40 * everywhere else) VirtualBox client application from the same source code
41 * (including common smart C++ templates for automatic interface pointer
42 * reference counter and string data management);
43 * b) simpler XPCOM initialization and shutdown (only a signle method call
44 * that does everything right).
45 *
46 * Currently, there is no separate sample program that uses the VirtualBox MS
47 * COM XPCOM Glue library. Please refer to the sources of stock VirtualBox
48 * applications such as the VirtualBox GUI frontend or the VBoxManage command
49 * line frontend.
50 */
51
52
53#include <stdio.h>
54#include "VirtualBox.h"
55
56
57int listVMs(IVirtualBox *virtualBox)
58{
59 HRESULT rc;
60
61 /*
62 * First we have to get a list of all registered VMs
63 */
64 IMachineCollection *collection = NULL;
65 IMachineEnumerator *enumerator = NULL;
66
67 do
68 {
69 rc = virtualBox->get_Machines(&collection);
70 if (SUCCEEDED(rc))
71 rc = collection->Enumerate(&enumerator);
72
73 if (SUCCEEDED(rc))
74 {
75 BOOL hasMore;
76 while (enumerator->HasMore(&hasMore), hasMore)
77 {
78 /*
79 * Get the machine object
80 */
81 IMachine *machine = NULL;
82 rc = enumerator->GetNext(&machine);
83 if (SUCCEEDED(rc))
84 {
85 BSTR str;
86
87 machine->get_Name(&str);
88 printf("Name: %S\n", str);
89
90 SysFreeString(str);
91
92 machine->Release();
93 }
94 }
95 }
96 } while (0);
97
98 if (enumerator)
99 enumerator->Release();
100 if (collection)
101 collection->Release();
102
103 return 0;
104}
105
106int testErrorInfo(IVirtualBox *virtualBox)
107{
108 HRESULT rc;
109
110 /* try to find a machine that doesn't exist */
111 IMachine *machine = NULL;
112 BSTR machineName = SysAllocString(L"Foobar");
113
114 rc = virtualBox->FindMachine(machineName, &machine);
115
116 if (FAILED(rc))
117 {
118 IErrorInfo *errorInfo;
119
120 rc = GetErrorInfo(0, &errorInfo);
121
122 if (FAILED(rc))
123 printf("Error getting error info! rc = 0x%x\n", rc);
124 else
125 {
126 BSTR errorDescription = NULL;
127
128 rc = errorInfo->GetDescription(&errorDescription);
129
130 if (FAILED(rc) || !errorDescription)
131 printf("Error getting error description! rc = 0x%x\n", rc);
132 else
133 {
134 printf("Successfully retrieved error description: %S\n", errorDescription);
135
136 SysFreeString(errorDescription);
137 }
138
139 errorInfo->Release();
140 }
141 }
142
143 if (machine)
144 machine->Release();
145
146 SysFreeString(machineName);
147
148 return 0;
149}
150
151
152int main(int argc, char *argv[])
153{
154 HRESULT rc;
155 IVirtualBox *virtualBox;
156
157 do
158 {
159 /* initialize the COM subsystem */
160 CoInitialize(NULL);
161
162 /* instantiate the VirtualBox root object */
163 rc = CoCreateInstance(CLSID_VirtualBox, /* the VirtualBox base object */
164 NULL, /* no aggregation */
165 CLSCTX_LOCAL_SERVER, /* the object lives in a server process on this machine */
166 IID_IVirtualBox, /* IID of the interface */
167 (void**)&virtualBox);
168
169 if (!SUCCEEDED(rc))
170 {
171 printf("Error creating VirtualBox instance! rc = 0x%x\n", rc);
172 break;
173 }
174
175 listVMs(virtualBox);
176
177 testErrorInfo(virtualBox);
178
179 /* release the VirtualBox object */
180 virtualBox->Release();
181
182 } while (0);
183
184 CoUninitialize();
185 return 0;
186}
187
188
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