xcopy: Add support for /C (Continue if errors).
[wine/testsucceed.git] / dlls / msi / tests / iface.c
blob8a18e34088a13b3e0f8dc3f737696f5185bc59b8
1 /*
2 * tests for Microsoft Installer functionality
4 * Copyright 2007 Mike McCormack for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define COBJMACROS
23 #include <stdio.h>
24 #include <windows.h>
25 #include <msi.h>
26 #include <msiquery.h>
27 #include <ole2.h>
29 #include "wine/test.h"
31 static GUID CLSID_IInstaller = { 0xc1090, 0, 0, {0xc0,0,0,0,0,0,0,0x46} };
32 static GUID IID_IMsiServer = { 0xc101c, 0, 0, {0xc0,0,0,0,0,0,0,0x46} };
34 static DISPID get_dispid( IDispatch *disp, const char *name )
36 LPOLESTR str;
37 UINT len;
38 DISPID id;
39 HRESULT r;
41 len = MultiByteToWideChar(CP_ACP, 0, name, -1, NULL, 0 );
42 str = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR) );
43 len = MultiByteToWideChar(CP_ACP, 0, name, -1, str, len );
45 r = IDispatch_GetIDsOfNames( disp, &IID_IMsiServer, &str, 1, 0, &id );
46 if (r != S_OK)
47 return -1;
49 return id;
52 static void test_msi_dispid(void)
54 HRESULT r;
55 IDispatch *disp = NULL;
57 r = CoCreateInstance( &CLSID_IInstaller, NULL, CLSCTX_INPROC_SERVER,
58 &IID_IDispatch, (LPVOID*) &disp );
59 todo_wine ok( r == S_OK, "failed to create an installer instance %08x\n", r);
60 if (r != S_OK)
62 skip( "IMsiServer interface not present\n");
63 return;
66 todo_wine {
67 ok( get_dispid( disp, "CreateRecord" ) == 1, "dispid wrong\n");
68 ok( get_dispid( disp, "OpenPackage" ) == 2, "dispid wrong\n");
69 ok( get_dispid( disp, "OpenProduct" ) == 3, "dispid wrong\n");
70 ok( get_dispid( disp, "OpenDatabase" ) == 4, "dispid wrong\n");
71 ok( get_dispid( disp, "SummaryInformation" ) == 5, "dispid wrong\n");
72 ok( get_dispid( disp, "UILevel" ) == 6, "dispid wrong\n");
73 ok( get_dispid( disp, "EnableLog" ) == 7, "dispid wrong\n");
74 ok( get_dispid( disp, "InstallProduct" ) == 8, "dispid wrong\n");
75 ok( get_dispid( disp, "Version" ) == 9, "dispid wrong\n");
76 ok( get_dispid( disp, "LastErrorRecord" ) == 10, "dispid wrong\n");
77 ok( get_dispid( disp, "RegistryValue" ) == 11, "dispid wrong\n");
78 ok( get_dispid( disp, "Environment" ) == 12, "dispid wrong\n");
79 ok( get_dispid( disp, "FileAttributes" ) == 13, "dispid wrong\n");
81 ok( get_dispid( disp, "FileSize" ) == 15, "dispid wrong\n");
82 ok( get_dispid( disp, "FileVersion" ) == 16, "dispid wrong\n");
83 ok( get_dispid( disp, "ProductState" ) == 17, "dispid wrong\n");
84 ok( get_dispid( disp, "ProductInfo" ) == 18, "dispid wrong\n");
85 ok( get_dispid( disp, "ConfigureProduct" ) == 19, "dispid wrong\n");
86 ok( get_dispid( disp, "ReinstallProduct" ) == 20 , "dispid wrong\n");
87 ok( get_dispid( disp, "CollectUserInfo" ) == 21, "dispid wrong\n");
88 ok( get_dispid( disp, "ApplyPatch" ) == 22, "dispid wrong\n");
89 ok( get_dispid( disp, "FeatureParent" ) == 23, "dispid wrong\n");
90 ok( get_dispid( disp, "FeatureState" ) == 24, "dispid wrong\n");
91 ok( get_dispid( disp, "UseFeature" ) == 25, "dispid wrong\n");
92 ok( get_dispid( disp, "FeatureUsageCount" ) == 26, "dispid wrong\n");
93 ok( get_dispid( disp, "FeatureUsageDate" ) == 27, "dispid wrong\n");
94 ok( get_dispid( disp, "ConfigureFeature" ) == 28, "dispid wrong\n");
95 ok( get_dispid( disp, "ReinstallFeature" ) == 29, "dispid wrong\n");
96 ok( get_dispid( disp, "ProvideComponent" ) == 30, "dispid wrong\n");
97 ok( get_dispid( disp, "ComponentPath" ) == 31, "dispid wrong\n");
98 ok( get_dispid( disp, "ProvideQualifiedComponent" ) == 32, "dispid wrong\n");
99 ok( get_dispid( disp, "QualifierDescription" ) == 33, "dispid wrong\n");
100 ok( get_dispid( disp, "ComponentQualifiers" ) == 34, "dispid wrong\n");
101 ok( get_dispid( disp, "Products" ) == 35, "dispid wrong\n");
102 ok( get_dispid( disp, "Features" ) == 36, "dispid wrong\n");
103 ok( get_dispid( disp, "Components" ) == 37, "dispid wrong\n");
104 ok( get_dispid( disp, "ComponentClients" ) == 38, "dispid wrong\n");
105 ok( get_dispid( disp, "Patches" ) == 39, "dispid wrong\n");
106 ok( get_dispid( disp, "RelatedProducts" ) == 40, "dispid wrong\n");
107 ok( get_dispid( disp, "PatchInfo" ) == 41, "dispid wrong\n");
108 ok( get_dispid( disp, "PatchTransforms" ) == 42, "dispid wrong\n");
109 ok( get_dispid( disp, "AddSource" ) == 43, "dispid wrong\n");
110 ok( get_dispid( disp, "ClearSourceList" ) == 44, "dispid wrong\n");
111 ok( get_dispid( disp, "ForceSourceListResolution" ) == 45, "dispid wrong\n");
112 ok( get_dispid( disp, "ShortcutTarget" ) == 46, "dispid wrong\n");
113 ok( get_dispid( disp, "FileHash" ) == 47, "dispid wrong\n");
114 ok( get_dispid( disp, "FileSignatureInfo" ) == 48, "dispid wrong\n");
115 ok( get_dispid( disp, "RemovePatches" ) == 49, "dispid wrong\n");
117 ok( get_dispid( disp, "ApplyMultiplePatches" ) == 51, "dispid wrong\n");
118 ok( get_dispid( disp, "ProductsEx" ) == 52, "dispid wrong\n");
120 ok( get_dispid( disp, "PatchesEx" ) == 55, "dispid wrong\n");
122 ok( get_dispid( disp, "ExtractPatchXMLData" ) == 57, "dispid wrong\n");
125 /* MSDN claims the following functions exist but IDispatch->GetIDsOfNames disagrees */
126 if (0)
128 get_dispid( disp, "ProductElevated" );
129 get_dispid( disp, "ProductInfoFromScript" );
130 get_dispid( disp, "ProvideAssembly" );
131 get_dispid( disp, "CreateAdvertiseScript" );
132 get_dispid( disp, "AdvertiseProduct" );
133 get_dispid( disp, "PatchFiles" );
136 IDispatch_Release( disp );
139 static void test_msi_invoke(void)
141 IDispatch *installer = NULL, *record = NULL;
142 DISPPARAMS param;
143 VARIANTARG varg;
144 VARIANT result;
145 DISPID dispid;
146 DISPID arg;
147 HRESULT r;
149 r = CoCreateInstance( &CLSID_IInstaller, NULL, CLSCTX_INPROC_SERVER,
150 &IID_IDispatch, (LPVOID*) &installer );
151 todo_wine ok( r == S_OK, "failed to create an installer instance %08x\n", r);
152 if (r != S_OK)
154 skip( "IMsiServer interface not present\n");
155 return;
158 arg = 0;
160 V_UINT(&varg) = 1;
161 V_VT(&varg) = VT_I4;
163 param.cArgs = 1;
164 param.cNamedArgs = 0;
165 param.rgvarg = &varg;
166 param.rgdispidNamedArgs = &arg;
168 dispid = get_dispid( installer, "CreateRecord" );
170 r = IDispatch_Invoke( installer, dispid, &IID_NULL, 0,
171 DISPATCH_METHOD, &param, &result, NULL, NULL);
172 todo_wine ok( r == S_OK, "dispatch failed %08x\n", r);
173 if (SUCCEEDED(r))
175 ok( V_VT(&result) == VT_DISPATCH, "type wrong\n");
177 record = V_DISPATCH(&result);
179 memset( &result, 0, sizeof result );
180 dispid = get_dispid( record, "FieldCount" );
182 param.cArgs = 0;
183 param.cNamedArgs = 0;
184 param.rgvarg = &varg;
185 param.rgdispidNamedArgs = &arg;
187 r = IDispatch_Invoke( record, dispid, &IID_NULL, 0,
188 DISPATCH_PROPERTYGET, &param, &result, NULL, NULL );
189 ok( r == S_OK, "dispatch failed %08x\n", r);
191 ok( V_VT(&result) == VT_I4, "type wrong\n");
192 ok( V_I4(&result) == 1, "field count wrong\n");
194 IDispatch_Release( record );
196 else
197 skip( "failed to create record\n");
199 memset( &result, 0, sizeof result );
200 dispid = get_dispid( installer, "Version" );
202 param.cArgs = 0;
203 param.cNamedArgs = 0;
204 param.rgvarg = &varg;
205 param.rgdispidNamedArgs = &arg;
207 r = IDispatch_Invoke( installer, dispid, &IID_NULL, 0,
208 DISPATCH_PROPERTYGET, &param, &result, NULL, NULL );
209 todo_wine {
210 ok( r == S_OK, "dispatch failed %08x\n", r);
211 ok( V_VT(&result) == VT_BSTR, "type wrong %d\n", V_VT(&result));
214 IDispatch_Release( installer );
217 START_TEST(iface)
219 CoInitialize( NULL );
221 test_msi_dispid();
222 test_msi_invoke();
224 CoUninitialize();