Changeset 16248 in vbox
- Timestamp:
- Jan 26, 2009 9:11:36 PM (16 years ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/ApplianceImpl.cpp
r16237 r16248 74 74 uint32_t ulParent; 75 75 76 string strHostResource;77 76 OVFResourceType_T resourceType; 78 77 string strOtherResourceType; 79 78 string strResourceSubType; 79 80 string strHostResource; // "Abstractly specifies how a device shall connect to a resource on the deployment platform. 81 // Not all devices need a backing." Used with disk items, for which this references a virtual 82 // disk from the Disks section. 80 83 bool fAutomaticAllocation; 81 84 bool fAutomaticDeallocation; 82 string strConnection; // for ethernet 83 string strAddress; 84 string strAddressOnParent; 85 string strAllocationUnits; 86 uint64_t ullVirtualQuantity; 87 uint64_t ullReservation; 88 uint64_t ullLimit; 89 uint64_t ullWeight; 85 string strConnection; // "All Ethernet adapters that specify the same abstract network connection name within an OVF 86 // package shall be deployed on the same network. The abstract network connection name shall be 87 // listed in the NetworkSection at the outermost envelope level." 88 string strAddress; // "Device-specific. For an Ethernet adapter, this specifies the MAC address." 89 string strAddressOnParent; // "For a device, this specifies its location on the controller." 90 string strAllocationUnits; // "Specifies the units of allocation used. For example, “byte * 2^20”." 91 uint64_t ullVirtualQuantity; // "Specifies the quantity of resources presented. For example, “256”." 92 uint64_t ullReservation; // "Specifies the minimum quantity of resources guaranteed to be available." 93 uint64_t ullLimit; // "Specifies the maximum quantity of resources that will be granted." 94 uint64_t ullWeight; // "Specifies a relative priority for this allocation in relation to other allocations." 95 90 96 string strConsumerVisibility; 91 97 string strMappingBehavior; 92 98 string strPoolID; 93 uint32_t ulBusNumber; 94 95 uint32_t ulLineNumber; // line number of <Item> element in XML source99 uint32_t ulBusNumber; // seen with IDE controllers, but not listed in OVF spec 100 101 uint32_t ulLineNumber; // line number of <Item> element in XML source; cached for error messages 96 102 97 103 VirtualHardwareItem() 98 : ulInstanceID(0), fAutomaticAllocation(false), fAutomaticDeallocation(false), ullVirtualQuantity(0), ullReservation(0), ullLimit(0), ullWeight(0) 104 : ulInstanceID(0), fAutomaticAllocation(false), fAutomaticDeallocation(false), ullVirtualQuantity(0), ullReservation(0), ullLimit(0), ullWeight(0), ulBusNumber(0), ulLineNumber(0) 99 105 {}; 100 106 }; … … 835 841 } 836 842 837 STDMETHODIMP Appliance:: GetDisks(ComSafeArrayOut(BSTR, aDisks), ULONG *cDisks)843 STDMETHODIMP Appliance::COMGETTER(Disks)(ComSafeArrayOut(BSTR, aDisks)) 838 844 { 839 845 CheckComArgOutSafeArrayPointerValid(aDisks); … … 880 886 } 881 887 882 *cDisks = (ULONG)i;883 884 888 sfaDisks.detachTo(ComSafeArrayOutArg(aDisks)); 885 889 … … 898 902 SafeIfaceArray<IVirtualSystemDescription> sfaVSD(m->virtualSystemDescriptions); 899 903 sfaVSD.detachTo(ComSafeArrayOutArg(aVirtualSystemDescriptions)); 900 901 return S_OK;902 }903 904 STDMETHODIMP Appliance::ImportAppliance()905 {906 HRESULT rc = S_OK;907 908 list<VirtualSystem>::const_iterator it;909 list< ComObjPtr<VirtualSystemDescription> >::const_iterator it1;910 /* Iterate through all appliances */911 size_t i = 0;912 for (it = m->llVirtualSystems.begin(),913 it1 = m->virtualSystemDescriptions.begin();914 it != m->llVirtualSystems.end();915 ++it, ++it1, ++i)916 {917 const VirtualSystem &vs = *it;918 ComObjPtr<VirtualSystemDescription> vsd = (*it1);919 920 /* Guest OS type */921 list<VirtualSystemDescriptionEntry> vsdeOS = vsd->findByType(VirtualSystemDescriptionType_OS);922 Assert(vsdeOS.size() == 1);923 string osTypeVBox = vsdeOS.front().strFinalValue;924 925 /* Now that we know the base system get our internal defaults based on that. */926 IGuestOSType *osType = NULL;927 rc = mVirtualBox->GetGuestOSType(Bstr(Utf8Str(osTypeVBox.c_str())), &osType);928 ComAssertComRCThrowRC(rc);929 930 /* Create the machine */931 /* First get the name */932 list<VirtualSystemDescriptionEntry> vsdeName = vsd->findByType(VirtualSystemDescriptionType_Name);933 Assert(vsdeName.size() == 1);934 string nameVBox = vsdeName.front().strFinalValue;935 IMachine *newMachine = NULL;936 rc = mVirtualBox->CreateMachine(Bstr(nameVBox.c_str()), Bstr(osTypeVBox.c_str()),937 Bstr(), Guid(),938 &newMachine);939 ComAssertComRCThrowRC(rc);940 941 /* CPU count (ignored for now) */942 /* @todo: check min/max requirements of VBox (SchemaDefs::Min/MaxCPUCount) */943 // list<VirtualSystemDescriptionEntry> vsdeCPU = vsd->findByType (VirtualSystemDescriptionType_CPU);944 945 /* RAM */946 /* @todo: check min/max requirements of VBox (SchemaDefs::Min/MaxGuestRAM) */947 list<VirtualSystemDescriptionEntry> vsdeRAM = vsd->findByType(VirtualSystemDescriptionType_Memory);948 Assert(vsdeRAM.size() == 1);949 string memoryVBox = vsdeRAM.front().strFinalValue;950 uint64_t tt = RTStrToUInt64(memoryVBox.c_str()) / _1M;951 952 rc = newMachine->COMSETTER(MemorySize)(tt);953 ComAssertComRCThrowRC(rc);954 955 /* VRAM */956 /* Get the recommended VRAM for this guest OS type */957 /* @todo: check min/max requirements of VBox (SchemaDefs::Min/MaxGuestVRAM) */958 ULONG vramVBox;959 rc = osType->COMGETTER(RecommendedVRAM)(&vramVBox);960 ComAssertComRCThrowRC(rc);961 /* Set the VRAM */962 rc = newMachine->COMSETTER(VRAMSize)(vramVBox);963 ComAssertComRCThrowRC(rc);964 965 /* Change the network adapters */966 list<VirtualSystemDescriptionEntry> vsdeNW = vsd->findByType(VirtualSystemDescriptionType_NetworkAdapter);967 if (vsdeNW.size() == 0)968 {969 /* No network adapters, so we have to disable our default one */970 INetworkAdapter *nwVBox = NULL;971 rc = newMachine->GetNetworkAdapter(0, &nwVBox);972 ComAssertComRCThrowRC(rc);973 rc = nwVBox->COMSETTER(Enabled)(false);974 ComAssertComRCThrowRC(rc);975 }976 else977 {978 list<VirtualSystemDescriptionEntry>::const_iterator nwIt;979 /* Iterate through all network cards. We support 8 network adapters980 * at the maximum. (@todo: warn if it are more!) */981 size_t a = 0;982 for (nwIt = vsdeNW.begin();983 (nwIt != vsdeNW.end() && a < SchemaDefs::NetworkAdapterCount);984 ++nwIt, ++a)985 {986 string nwTypeVBox = nwIt->strFinalValue;987 uint32_t tt1 = RTStrToUInt32(nwTypeVBox.c_str());988 INetworkAdapter *nwVBox = NULL;989 rc = newMachine->GetNetworkAdapter((ULONG)a, &nwVBox);990 ComAssertComRCThrowRC(rc);991 /* Enable the network card & set the adapter type */992 /* NAT is set as default */993 rc = nwVBox->COMSETTER(Enabled)(true);994 ComAssertComRCThrowRC(rc);995 rc = nwVBox->COMSETTER(AdapterType)(static_cast<NetworkAdapterType_T>(tt1));996 ComAssertComRCThrowRC(rc);997 }998 }999 /* Now its time to register the machine before we add any hard disks */1000 rc = mVirtualBox->RegisterMachine(newMachine);1001 ComAssertComRCThrowRC(rc);1002 1003 /* @todo: Unregister on failure */1004 #if 01005 vbox.UnregisterMachine (machineId);1006 if (vbox.isOk())1007 mMachine.DeleteSettings();1008 return false;1009 #endif1010 }1011 904 1012 905 return S_OK; … … 1372 1265 } 1373 1266 1267 STDMETHODIMP Appliance::ImportAppliance() 1268 { 1269 HRESULT rc = S_OK; 1270 1271 list<VirtualSystem>::const_iterator it; 1272 list< ComObjPtr<VirtualSystemDescription> >::const_iterator it1; 1273 /* Iterate through all appliances */ 1274 size_t i = 0; 1275 for (it = m->llVirtualSystems.begin(), 1276 it1 = m->virtualSystemDescriptions.begin(); 1277 it != m->llVirtualSystems.end(); 1278 ++it, ++it1, ++i) 1279 { 1280 const VirtualSystem &vs = *it; 1281 ComObjPtr<VirtualSystemDescription> vsd = (*it1); 1282 1283 /* Guest OS type */ 1284 list<VirtualSystemDescriptionEntry> vsdeOS = vsd->findByType(VirtualSystemDescriptionType_OS); 1285 Assert(vsdeOS.size() == 1); 1286 string osTypeVBox = vsdeOS.front().strFinalValue; 1287 1288 /* Now that we know the base system get our internal defaults based on that. */ 1289 IGuestOSType *osType = NULL; 1290 rc = mVirtualBox->GetGuestOSType(Bstr(Utf8Str(osTypeVBox.c_str())), &osType); 1291 ComAssertComRCThrowRC(rc); 1292 1293 /* Create the machine */ 1294 /* First get the name */ 1295 list<VirtualSystemDescriptionEntry> vsdeName = vsd->findByType(VirtualSystemDescriptionType_Name); 1296 Assert(vsdeName.size() == 1); 1297 string nameVBox = vsdeName.front().strFinalValue; 1298 IMachine *newMachine = NULL; 1299 rc = mVirtualBox->CreateMachine(Bstr(nameVBox.c_str()), Bstr(osTypeVBox.c_str()), 1300 Bstr(), Guid(), 1301 &newMachine); 1302 ComAssertComRCThrowRC(rc); 1303 1304 /* CPU count (ignored for now) */ 1305 /* @todo: check min/max requirements of VBox (SchemaDefs::Min/MaxCPUCount) */ 1306 // list<VirtualSystemDescriptionEntry> vsdeCPU = vsd->findByType (VirtualSystemDescriptionType_CPU); 1307 1308 /* RAM */ 1309 /* @todo: check min/max requirements of VBox (SchemaDefs::Min/MaxGuestRAM) */ 1310 list<VirtualSystemDescriptionEntry> vsdeRAM = vsd->findByType(VirtualSystemDescriptionType_Memory); 1311 Assert(vsdeRAM.size() == 1); 1312 string memoryVBox = vsdeRAM.front().strFinalValue; 1313 uint64_t tt = RTStrToUInt64(memoryVBox.c_str()) / _1M; 1314 1315 rc = newMachine->COMSETTER(MemorySize)(tt); 1316 ComAssertComRCThrowRC(rc); 1317 1318 /* VRAM */ 1319 /* Get the recommended VRAM for this guest OS type */ 1320 /* @todo: check min/max requirements of VBox (SchemaDefs::Min/MaxGuestVRAM) */ 1321 ULONG vramVBox; 1322 rc = osType->COMGETTER(RecommendedVRAM)(&vramVBox); 1323 ComAssertComRCThrowRC(rc); 1324 /* Set the VRAM */ 1325 rc = newMachine->COMSETTER(VRAMSize)(vramVBox); 1326 ComAssertComRCThrowRC(rc); 1327 1328 /* Change the network adapters */ 1329 list<VirtualSystemDescriptionEntry> vsdeNW = vsd->findByType(VirtualSystemDescriptionType_NetworkAdapter); 1330 if (vsdeNW.size() == 0) 1331 { 1332 /* No network adapters, so we have to disable our default one */ 1333 INetworkAdapter *nwVBox = NULL; 1334 rc = newMachine->GetNetworkAdapter(0, &nwVBox); 1335 ComAssertComRCThrowRC(rc); 1336 rc = nwVBox->COMSETTER(Enabled)(false); 1337 ComAssertComRCThrowRC(rc); 1338 } 1339 else 1340 { 1341 list<VirtualSystemDescriptionEntry>::const_iterator nwIt; 1342 /* Iterate through all network cards. We support 8 network adapters 1343 * at the maximum. (@todo: warn if it are more!) */ 1344 size_t a = 0; 1345 for (nwIt = vsdeNW.begin(); 1346 (nwIt != vsdeNW.end() && a < SchemaDefs::NetworkAdapterCount); 1347 ++nwIt, ++a) 1348 { 1349 string nwTypeVBox = nwIt->strFinalValue; 1350 uint32_t tt1 = RTStrToUInt32(nwTypeVBox.c_str()); 1351 INetworkAdapter *nwVBox = NULL; 1352 rc = newMachine->GetNetworkAdapter((ULONG)a, &nwVBox); 1353 ComAssertComRCThrowRC(rc); 1354 /* Enable the network card & set the adapter type */ 1355 /* NAT is set as default */ 1356 rc = nwVBox->COMSETTER(Enabled)(true); 1357 ComAssertComRCThrowRC(rc); 1358 rc = nwVBox->COMSETTER(AdapterType)(static_cast<NetworkAdapterType_T>(tt1)); 1359 ComAssertComRCThrowRC(rc); 1360 } 1361 } 1362 /* Now its time to register the machine before we add any hard disks */ 1363 rc = mVirtualBox->RegisterMachine(newMachine); 1364 ComAssertComRCThrowRC(rc); 1365 1366 /* @todo: Unregister on failure */ 1367 #if 0 1368 vbox.UnregisterMachine (machineId); 1369 if (vbox.isOk()) 1370 mMachine.DeleteSettings(); 1371 return false; 1372 #endif 1373 } 1374 1375 return S_OK; 1376 } 1377 1374 1378 HRESULT Appliance::searchUniqueVMName(std::string& aName) 1375 1379 { -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r16238 r16248 2882 2882 <link to="IVirtualBox::openAppliance" />. 2883 2883 2884 Opening an appliance is a three-step process with VirtualBox: first 2885 <link to="IVirtualBox::openAppliance" /> is called, which succeeds if the 2886 appliance file is syntactically valid, irrespective of whether VirtualBox 2887 can handle the appliance. 2888 2889 As a second step, the caller should then invoke <link to="IAppliance::interpret" />, 2890 which analyzes the OVF data and sets up the contents of the IAppliance attributes 2891 accordingly. These can be inspected by a VirtualBox front-end such as the GUI, 2892 and the suggestions can be displayed to the user. For example, the virtual system 2893 will contain the virtual hardware prescribed by the OVF (network and hardware 2894 adapters, virtual disk images, memory size and so on), and the GUI can then give 2895 the user the option to confirm and/or change these suggestions. 2896 2897 As a third step, the caller should invoke <link to="#Import" />, which will create 2898 virtual machines in VirtualBox as instances of <link to="IMachine" /> that match the 2899 information in the virtual system descriptions. 2884 Importing an OVF appliance into VirtualBox is a three-step process: 2885 2886 <ol> 2887 <li> 2888 Call <link to="IVirtualBox::openAppliance" /> with the full path of the OVF 2889 file. So long as the appliance file is syntactically valid, this will succeed 2890 and return an instance of IAppliance that contains the parsed data from the 2891 OVF file. 2892 </li> 2893 2894 <li>The caller should then invoke <link to="#interpret" />, which 2895 analyzes the OVF data and sets up the contents of the IAppliance attributes 2896 accordingly. These can be inspected by a VirtualBox front-end such as the GUI, 2897 and the suggestions can be displayed to the user. For example, the virtual system 2898 will contain the virtual hardware prescribed by the OVF (network and hardware 2899 adapters, virtual disk images, memory size and so on), and the GUI can then give 2900 the user the option to confirm and/or change these suggestions. 2901 </li> 2902 2903 <li>Finally, the caller should invoke <link to="#importAppliance" />, which will 2904 create virtual machines in VirtualBox as instances of <link to="IMachine" /> that 2905 match the information in the virtual system descriptions. 2906 </li> 2907 </ol> 2908 2900 2909 </desc> 2901 2910 … … 2905 2914 </attribute> 2906 2915 2907 <attribute name="virtualSystemDescriptions" type="IVirtualSystemDescription" readonly="yes" safearray="yes"> 2908 <desc> 2909 Array of virtual system descriptions. One such description gets created by 2910 <link to="#interpret" /> for each virtual system found in the OVF. 2911 </desc> 2912 </attribute> 2913 2914 <method name="interpret"> 2915 <desc> 2916 Interprets the OVF data that was read when the appliance was constructed. After 2917 calling this method, one can call 2918 <link to="#getDisks" /> to retrieve disk information and also inspect the 2919 <link to="#virtualSystemDescriptions" /> array attribute, which will then contain 2920 one <link to="IVirtualSystemDescription" /> for each virtual machine found in 2921 the appliance. 2922 </desc> 2923 </method> 2924 2925 <method name="getDisks"> 2926 <desc> 2927 Returns disk information from the appliance specification in a string 2928 array. Each array item represents one piece of disk information, with the 2929 information fields separated by tab (\t) characters. 2916 <attribute name="disks" type="wstring" readonly="yes" safearray="yes"> 2917 <desc> 2918 Array of virtual disk definitions. One such description exists for each 2919 disk definition in the OVF; each string array item represents one such piece of 2920 disk information, with the information fields separated by tab (\t) characters. 2930 2921 2931 2922 The caller should be prepared for additional fields being appended to … … 2952 2943 <li>Compression (optional string equalling "gzip" if the image is gzip-compressed)</li> 2953 2944 </ol> 2954 2955 </desc> 2956 2957 <param name="aDisks" type="wstring" dir="out" safearray="yes"> 2958 <desc>Array of strings to receive disk information.</desc> 2959 </param> 2960 2961 <param name="cDisks" type="unsigned long" dir="return"> 2962 <desc>Count of array items returned in aDisks.</desc> 2963 </param> 2945 </desc> 2946 </attribute> 2947 2948 <attribute name="virtualSystemDescriptions" type="IVirtualSystemDescription" readonly="yes" safearray="yes"> 2949 <desc> 2950 Array of virtual system descriptions. One such description is created 2951 for each virtual system found in the OVF. The array is empty until after <link to="#interpret" /> 2952 has been called. 2953 </desc> 2954 </attribute> 2955 2956 <method name="interpret"> 2957 <desc> 2958 Interprets the OVF data that was read when the appliance was constructed. After 2959 calling this method, one can inspect the 2960 <link to="#virtualSystemDescriptions" /> array attribute, which will then contain 2961 one <link to="IVirtualSystemDescription" /> for each virtual machine found in 2962 the appliance. 2963 2964 Calling this method is the second step of importing an appliance into VirtualBox; 2965 see <link to="IAppliance" /> for an overview. 2966 </desc> 2964 2967 </method> 2965 2968 2966 2969 <method name="importAppliance"> 2970 <desc> 2971 Imports the appliance into VirtualBox by creating instances of <link to="IMachine" /> 2972 and other interfaces that match the information contained in the appliance as 2973 closely as possible, as represented by the import instructions in the 2974 <link to="#virtualSystemDescriptions" /> array. 2975 2976 Calling this method is the final step of importing an appliance into VirtualBox; 2977 see <link to="IAppliance" /> for an overview. 2978 </desc> 2967 2979 </method> 2968 2980 … … 2973 2985 uuid="36209b5a-8f96-44de-a0af-1bb037cef324" 2974 2986 > 2975 <desc> 2976 </desc>2987 <desc>Used with <link to="IVirtualSystemDescription" /> to describe the type of 2988 a configuration value.</desc> 2977 2989 2978 2990 <const name="Name" value="1" /> … … 2994 3006 > 2995 3007 3008 <desc>This interface is used in the <link to="IAppliance::virtualSystemDescriptions" /> array. 3009 After <link to="IAppliance::interpret" /> has been called, that array contains 3010 information about how the virtual systems described in the OVF should best be imported into VirtualBox 3011 virtual machines. See <link to="IAppliance" /> for the steps required to import an OVF 3012 into VirtualBox. 3013 </desc> 3014 2996 3015 <method name="getDescription"> 2997 <desc></desc> 3016 <desc>Returns information about the virtual system as arrays of instruction items. In each array, the 3017 items with the same indices correspond and jointly represent an import instruction for VirtualBox. 3018 3019 The list below identifies the value sets that are possible depending on the 3020 <link to="VirtualSystemDescriptionType" /> enum value in the array item in aTypes[]. In each case, 3021 the array item with the same index in aOrigValues[] will contain the original value as contained 3022 in the OVF file, and the corresponding item in aAutoValues[] will contain a suggested value to 3023 be used for VirtualBox. Items in the other arrays will be empty, unless specified otherwise below: 3024 3025 <ul> 3026 <li> 3027 "OS": then the corresponding item in aAutoValues[] contains the suggested guest operating system 3028 for VirtualBox. The corresponding item in aOrigValues[] will contain a numerical value that 3029 described the operating system in the OVF (see <link to="CIMOSType" />). 3030 </li> 3031 <li> 3032 "Name": then the correponding item im aOrigValues[] will contain the suggested virtual machine name 3033 from the OVF file, and aAutoValues[] will contain a suggestion for a unique VirtualBox 3034 <link to="IMachine" /> name that does not exist yet. 3035 </li> 3036 <li> 3037 "CPU": number of CPUs. 3038 </li> 3039 <li> 3040 "Memory": amount of memory, in bytes. 3041 </li> 3042 <li> 3043 "HarddiskControllerSCSI": a SCSI hard disk controller. Here the items in aOrigValues[] and aAutoValues[] will either be 3044 "LsiLogic" or "BusLogic". The matching item in the aRefValue[] array will contain a numerical 3045 index that other items of the "Harddisk" type can use to specify which hard disk controller 3046 a virtual disk should be connected to. 3047 </li> 3048 <li> 3049 "HarddiskControllerIDE": an IDE hard disk controller. This has no value in aOrigValues[] or aAutoValues[]; 3050 as with SCSI controllers, the matching item in the aRefValues[] array will contain a numerical 3051 index that other items of the "Harddisk" type can use to specify which hard disk controller 3052 a virtual disk should be connected to. 3053 </li> 3054 <li> 3055 "Harddisk": a virtual hard disk, most probably as a reference to an image file. The array item 3056 in aOrigValues[] will contain the file specification from the OVF file, whereas the item 3057 in aAutoValues[] will contain the fully qualified path to the image, which VirtualBox has verified 3058 to exist. 3059 The item in the aRefValues[] array specifies the hard disk controller to connect to and has the 3060 same value as another aRefValues[] array item of the types listed above. 3061 </li> 3062 <li> 3063 "NetworkAdapter": a network adapter. (todo document) 3064 </li> 3065 </ul> 3066 3067 </desc> 2998 3068 2999 3069 <param name="aTypes" type="VirtualSystemDescriptionType" dir="out" safearray="yes"> -
trunk/src/VBox/Main/include/ApplianceImpl.h
r16237 r16248 65 65 /* IAppliance properties */ 66 66 STDMETHOD(COMGETTER(Path))(BSTR *aPath); 67 68 STDMETHOD(COMGETTER(VirtualSystemDescriptions))(ComSafeArrayOut 67 STDMETHOD(COMGETTER(Disks))(ComSafeArrayOut(BSTR, aDisks)); 68 STDMETHOD(COMGETTER(VirtualSystemDescriptions))(ComSafeArrayOut(IVirtualSystemDescription*, aVirtualSystemDescriptions)); 69 69 70 70 /* IAppliance methods */ 71 71 /* void interpret (); */ 72 72 STDMETHOD(Interpret)(void); 73 74 /* void getDisks (out unsigned long aDisksSize, [array, size_is (aDisksSize)] out wstring aDisks, [retval] out unsigned long cDisks); */75 STDMETHOD(GetDisks)(ComSafeArrayOut(BSTR, aDisks), ULONG *cDisks);76 73 77 74 /* public methods only for internal purposes */ … … 142 139 143 140 /* IVirtualSystemDescription methods */ 144 STDMETHOD(GetDescription) 145 146 147 148 149 STDMETHOD(SetFinalValues) (ComSafeArrayIn(IN_BSTR, aFinalValues));141 STDMETHOD(GetDescription)(ComSafeArrayOut(VirtualSystemDescriptionType_T, aTypes), 142 ComSafeArrayOut(ULONG, aRefs), 143 ComSafeArrayOut(BSTR, aOrigValues), 144 ComSafeArrayOut(BSTR, aAutoValues), 145 ComSafeArrayOut(BSTR, aConfigurations)); 146 STDMETHOD(SetFinalValues)(ComSafeArrayIn(IN_BSTR, aFinalValues)); 150 147 151 148 /* public methods only for internal purposes */
Note:
See TracChangeset
for help on using the changeset viewer.