diff --git a/rostests/winetests/mshtml/events.c b/rostests/winetests/mshtml/events.c index d62df7a3b0b..deafd54180c 100644 --- a/rostests/winetests/mshtml/events.c +++ b/rostests/winetests/mshtml/events.c @@ -483,9 +483,7 @@ static void _test_event_x(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_x(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_x failed: %08x\n", hres); - if(exl == -10) /* don't test the exact value */ - todo_wine ok_(__FILE__,line)(l > 0, "x = %d\n", l); - else + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "x = %d, expected %d\n", l, exl); } @@ -496,9 +494,7 @@ static void _test_event_y(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_y(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_y failed: %08x\n", hres); - if(exl == -10) /* don't test the exact value */ - todo_wine ok_(__FILE__,line)(l > 0, "y = %d\n", l); - else + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "y = %d, expected %d\n", l, exl); } @@ -509,14 +505,8 @@ static void _test_event_clientx(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_clientX(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_clientX failed: %08x\n", hres); - if(exl == -10) {/* don't test the exact value */ - if(xy_todo) - todo_wine ok_(__FILE__,line)(l > 0, "clientX = %d\n", l); - else - ok_(__FILE__,line)(l > 0, "clientX = %d\n", l); - }else { + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "clientX = %d, expected %d\n", l, exl); - } } static void _test_event_clienty(unsigned line, IHTMLEventObj *event, LONG exl) @@ -526,14 +516,8 @@ static void _test_event_clienty(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_clientY(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_clientY failed: %08x\n", hres); - if(exl == -10) {/* don't test the exact value */ - if(xy_todo) - todo_wine ok_(__FILE__,line)(l > 0, "clientY = %d\n", l); - else - ok_(__FILE__,line)(l > 0, "clientY = %d\n", l); - }else { + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "clientY = %d, expected %d\n", l, exl); - } } static void _test_event_offsetx(unsigned line, IHTMLEventObj *event, LONG exl) @@ -543,9 +527,7 @@ static void _test_event_offsetx(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_offsetX(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_offsetX failed: %08x\n", hres); - if(exl == -10) /* don't test the exact value */ - todo_wine ok_(__FILE__,line)(l > 0, "offsetX = %d\n", l); - else + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "offsetX = %d, expected %d\n", l, exl); } @@ -556,9 +538,7 @@ static void _test_event_offsety(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_offsetY(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_offsetY failed: %08x\n", hres); - if(exl == -10) /* don't test the exact value */ - todo_wine ok_(__FILE__,line)(l > 0, "offsetY = %d\n", l); - else + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "offsetY = %d, expected %d\n", l, exl); } @@ -569,14 +549,8 @@ static void _test_event_screenx(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_screenX(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_screenX failed: %08x\n", hres); - if(exl == -10) { /* don't test the exact value */ - if(xy_todo) - todo_wine ok_(__FILE__,line)(l > 0, "screenX = %d\n", l); - else - ok_(__FILE__,line)(l > 0, "screenX = %d\n", l); - }else { + if(exl != -10) /* don't test the exact value */ ok_(__FILE__,line)(l == exl, "screenX = %d, expected %d\n", l, exl); - } } static void _test_event_screeny(unsigned line, IHTMLEventObj *event, LONG exl) @@ -586,14 +560,8 @@ static void _test_event_screeny(unsigned line, IHTMLEventObj *event, LONG exl) hres = IHTMLEventObj_get_screenY(event, &l); ok_(__FILE__,line)(hres == S_OK, "get_screenY failed: %08x\n", hres); - if(exl == -10) { /* don't test the exact value */ - if(xy_todo) - todo_wine ok_(__FILE__,line)(l > 0, "screenY = %d\n", l); - else - ok_(__FILE__,line)(l > 0, "screenY = %d\n", l); - }else { + if(exl != -10) /* don't test the exact value for -10 */ ok_(__FILE__,line)(l == exl, "screenY = %d, expected %d\n", l, exl); - } } static void _test_event_type(unsigned line, IHTMLEventObj *event, const char *exstr) @@ -1204,6 +1172,10 @@ static void test_onclick(IHTMLDocument2 *doc) hres = IHTMLElement_put_onclick(div, v); ok(hres == S_OK, "put_onclick failed: %08x\n", hres); + V_VT(&v) = VT_NULL; + hres = IHTMLElement_put_ondblclick(div, v); + ok(hres == S_OK, "put_ondblclick failed: %08x\n", hres); + V_VT(&v) = VT_EMPTY; hres = IHTMLElement_get_onclick(div, &v); ok(hres == S_OK, "get_onclick failed: %08x\n", hres); diff --git a/rostests/winetests/mshtml/htmldoc.c b/rostests/winetests/mshtml/htmldoc.c index 7e0d4374365..65451b1793a 100644 --- a/rostests/winetests/mshtml/htmldoc.c +++ b/rostests/winetests/mshtml/htmldoc.c @@ -38,6 +38,7 @@ #include "idispids.h" #include "shlguid.h" #include "perhist.h" +#include "shobjidl.h" #include "mshtml_test.h" DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); @@ -155,6 +156,7 @@ DEFINE_EXPECT(Frame_GetWindow); DEFINE_EXPECT(TranslateUrl); DEFINE_EXPECT(Advise_Close); DEFINE_EXPECT(OnViewChange); +DEFINE_EXPECT(EvaluateNewWindow); static IUnknown *doc_unk; static IMoniker *doc_mon; @@ -164,7 +166,7 @@ static BOOL ipsex, ipsw; static BOOL set_clientsite, container_locked, navigated_load; static BOOL readystate_set_loading = FALSE, readystate_set_interactive = FALSE, load_from_stream; static BOOL editmode = FALSE, show_failed; -static BOOL inplace_deactivated; +static BOOL inplace_deactivated, open_call; static int stream_read, protocol_read; static enum load_state_t { LD_DOLOAD, @@ -296,6 +298,9 @@ static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, L BSTR doc_url = (void*)0xdeadbeef; HRESULT hres; + if(open_call) + return; /* FIXME */ + hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&permon); ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres); if(FAILED(hres)) @@ -332,7 +337,7 @@ static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, L }else if(exurl) { LPOLESTR url; - ok(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres); + ok_(__FILE__,line)(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres); hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url); ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres); @@ -737,6 +742,48 @@ static const IHlinkFrameVtbl HlinkFrameVtbl = { static IHlinkFrame HlinkFrame = { &HlinkFrameVtbl }; +static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface) +{ + return 2; +} + +static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface) +{ + return 1; +} + +static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl, + LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags, + DWORD dwUserActionTime) +{ + CHECK_EXPECT(EvaluateNewWindow); + + ok(!strcmp_wa(pszUrl, "about:blank"), "pszUrl = %s\n", wine_dbgstr_w(pszUrl)); + ok(!strcmp_wa(pszName, "test"), "pszName = %s\n", wine_dbgstr_w(pszName)); + ok(!strcmp_wa(pszUrlContext, "about:blank"), "pszUrlContext = %s\n", wine_dbgstr_w(pszUrlContext)); + ok(!pszFeatures, "pszFeatures = %s\n", wine_dbgstr_w(pszFeatures)); + ok(!fReplace, "fReplace = %x\n", fReplace); + ok(dwFlags == NWMF_FIRST, "dwFlags = %x\n", dwFlags); + ok(!dwUserActionTime, "dwUserActionime = %d\n", dwUserActionTime); + + return E_FAIL; +} + +static const INewWindowManagerVtbl NewWindowManagerVtbl = { + NewWindowManager_QueryInterface, + NewWindowManager_AddRef, + NewWindowManager_Release, + NewWindowManager_EvaluateNewWindow +}; + +static INewWindowManager NewWindowManager = { &NewWindowManagerVtbl }; + static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void**ppv) { @@ -1321,6 +1368,74 @@ static const IOleContainerVtbl OleContainerVtbl = { static IOleContainer OleContainer = { &OleContainerVtbl }; +static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv) +{ + return QueryInterface(riid, ppv); +} + +static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface) +{ + return 2; +} + +static ULONG WINAPI ClientSite_Release(IOleClientSite *iface) +{ + return 1; +} + +static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, + IMoniker **ppmon) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer) +{ + CHECK_EXPECT(GetContainer); + ok(ppContainer != NULL, "ppContainer = NULL\n"); + *ppContainer = &OleContainer; + return S_OK; +} + +static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IOleClientSiteVtbl ClientSiteVtbl = { + ClientSite_QueryInterface, + ClientSite_AddRef, + ClientSite_Release, + ClientSite_SaveObject, + ClientSite_GetMoniker, + ClientSite_GetContainer, + ClientSite_ShowObject, + ClientSite_OnShowWindow, + ClientSite_RequestNewObjectLayout +}; + +static IOleClientSite ClientSite = { &ClientSiteVtbl }; + static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv) { static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}}; @@ -1511,9 +1626,23 @@ static ULONG WINAPI InPlaceSiteWindowless_Release(IOleInPlaceSiteWindowless *ifa static HRESULT WINAPI InPlaceSiteWindowless_GetWindow( IOleInPlaceSiteWindowless *iface, HWND *phwnd) { + IOleClientSite *client_site; + IOleObject *ole_obj; + HRESULT hres; + CHECK_EXPECT2(GetWindow); ok(phwnd != NULL, "phwnd = NULL\n"); *phwnd = container_hwnd; + + hres = IUnknown_QueryInterface(doc_unk, &IID_IOleObject, (void**)&ole_obj); + ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres); + + hres = IOleObject_GetClientSite(ole_obj, &client_site); + IOleObject_Release(ole_obj); + ok(hres == S_OK, "GetClientSite failed: %08x\n", hres); + ok(client_site == &ClientSite, "client_site != ClientSite\n"); + IOleClientSite_Release(client_site); + return S_OK; } @@ -1774,74 +1903,6 @@ static const IOleInPlaceSiteWindowlessVtbl InPlaceSiteWindowlessVtbl = { static IOleInPlaceSiteWindowless InPlaceSiteWindowless = { &InPlaceSiteWindowlessVtbl }; -static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv) -{ - return QueryInterface(riid, ppv); -} - -static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface) -{ - return 2; -} - -static ULONG WINAPI ClientSite_Release(IOleClientSite *iface) -{ - return 1; -} - -static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, - IMoniker **ppmon) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer) -{ - CHECK_EXPECT(GetContainer); - ok(ppContainer != NULL, "ppContainer = NULL\n"); - *ppContainer = &OleContainer; - return S_OK; -} - -static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static const IOleClientSiteVtbl ClientSiteVtbl = { - ClientSite_QueryInterface, - ClientSite_AddRef, - ClientSite_Release, - ClientSite_SaveObject, - ClientSite_GetMoniker, - ClientSite_GetContainer, - ClientSite_ShowObject, - ClientSite_OnShowWindow, - ClientSite_RequestNewObjectLayout -}; - -static IOleClientSite ClientSite = { &ClientSiteVtbl }; - static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv) { return QueryInterface(riid, ppv); @@ -2423,6 +2484,8 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID ok(V_BSTR(pvaIn) != NULL, "V_BSTR(pvaIn) = NULL\n"); test_readyState(NULL); return S_OK; + case OLECMDID_UPDATETRAVELENTRY_DATARECOVERY: + return E_FAIL; /* FIXME */ default: ok(0, "unexpected command %d\n", nCmdID); return E_FAIL; @@ -2701,6 +2764,12 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG return S_OK; } + if(IsEqualGUID(&SID_SNewWindowManager, guidService)) { + ok(IsEqualGUID(&IID_INewWindowManager, riid), "unexpected riid\n"); + *ppv = &NewWindowManager; + return S_OK; + } + return E_NOINTERFACE; } @@ -2941,6 +3010,9 @@ static void _test_readyState(unsigned line, IUnknown *unk) "uninitialized" }; + if(open_call) + return; /* FIXME */ + if(!unk) unk = doc_unk; @@ -3405,6 +3477,43 @@ static void test_put_href(IHTMLDocument2 *doc) test_download(DWL_VERBDONE); } +static void test_open_window(IHTMLDocument2 *doc) +{ + IHTMLWindow2 *window, *new_window; + BSTR name, url; + HRESULT hres; + + hres = IHTMLDocument2_get_parentWindow(doc, &window); + ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); + + url = a2bstr("about:blank"); + name = a2bstr("test"); + new_window = (void*)0xdeadbeef; + + open_call = TRUE; + + SET_EXPECT(TranslateUrl); + SET_EXPECT(EvaluateNewWindow); + + hres = IHTMLWindow2_open(window, url, name, NULL, VARIANT_FALSE, &new_window); + todo_wine + ok(hres == S_OK, "open failed: %08x\n", hres); + todo_wine + ok(new_window == NULL, "new_window != NULL\n"); + + todo_wine + CHECK_CALLED(TranslateUrl); + todo_wine + CHECK_CALLED(EvaluateNewWindow); + + open_call = FALSE; + SysFreeString(url); + SysFreeString(name); + + IHTMLWindow2_Release(window); + SysFreeString(name); +} + static void test_clear(IHTMLDocument2 *doc) { HRESULT hres; @@ -4420,6 +4529,11 @@ static void test_QueryInterface(IHTMLDocument2 *doc) hres = IUnknown_QueryInterface(doc, &IID_IStdMarshalInfo, (void**)&qi); ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); ok(qi == NULL, "qi=%p, expected NULL\n", qi); + + hres = IUnknown_QueryInterface(doc, &IID_IDispatch, (void**)&qi); + ok(hres == S_OK, "Could not get IDispatch interface: %08x\n", hres); + ok(qi != (IUnknown*)doc, "disp == doc\n"); + IUnknown_Release(qi); } static void init_test(enum load_state_t ls) { @@ -4678,6 +4792,7 @@ static void test_HTMLDocument_http(void) test_GetCurMoniker((IUnknown*)doc, http_mon, NULL); test_put_href(doc); + test_open_window(doc); test_InPlaceDeactivate(doc, TRUE); test_Close(doc, FALSE); diff --git a/rostests/winetests/shell32/autocomplete.c b/rostests/winetests/shell32/autocomplete.c index 569625f8e7a..d4a84aeeeba 100644 --- a/rostests/winetests/shell32/autocomplete.c +++ b/rostests/winetests/shell32/autocomplete.c @@ -47,7 +47,7 @@ static IAutoComplete *test_init(void) win_skip("CLSID_AutoComplete is not registered\n"); return NULL; } - ok(SUCCEEDED(r), "no IID_IAutoComplete (0x%08x)\n", r); + ok(r == S_OK, "no IID_IAutoComplete (0x%08x)\n", r); /* AutoComplete source */ r = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER, @@ -57,11 +57,16 @@ static IAutoComplete *test_init(void) win_skip("CLSID_ACLMulti is not registered\n"); return NULL; } - ok(SUCCEEDED(r), "no IID_IACList (0x%08x)\n", r); + ok(r == S_OK, "no IID_IACList (0x%08x)\n", r); +if (0) +{ + /* crashes on native */ + r = IAutoComplete_Init(ac, hEdit, NULL, NULL, NULL); +} /* bind to edit control */ r = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL); - ok(SUCCEEDED(r), "Init failed (0x%08x)\n", r); + ok(r == S_OK, "Init failed (0x%08x)\n", r); IUnknown_Release(acSource); @@ -121,8 +126,8 @@ START_TEST(autocomplete) IAutoComplete* ac; r = CoInitialize(NULL); - ok(SUCCEEDED(r), "CoInitialize failed (0x%08x). Tests aborted.\n", r); - if (FAILED(r)) + ok(r == S_OK, "CoInitialize failed (0x%08x). Tests aborted.\n", r); + if (r != S_OK) return; createMainWnd(); diff --git a/rostests/winetests/shell32/generated.c b/rostests/winetests/shell32/generated.c index 76eec39f212..ace877eb420 100755 --- a/rostests/winetests/shell32/generated.c +++ b/rostests/winetests/shell32/generated.c @@ -58,45 +58,1853 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_BLOB(void) { - /* BLOB (pack 4) */ + /* BLOB */ + TEST_TYPE_SIZE (BLOB, 16) + TEST_TYPE_ALIGN (BLOB, 8) + TEST_FIELD_SIZE (BLOB, cbSize, 4) + TEST_FIELD_ALIGN (BLOB, cbSize, 4) + TEST_FIELD_OFFSET(BLOB, cbSize, 0) + TEST_FIELD_SIZE (BLOB, pBlobData, 8) + TEST_FIELD_ALIGN (BLOB, pBlobData, 8) + TEST_FIELD_OFFSET(BLOB, pBlobData, 8) +} + +static void test_pack_BSTR(void) +{ + /* BSTR */ + TEST_TYPE_SIZE (BSTR, 8) + TEST_TYPE_ALIGN (BSTR, 8) + TEST_TARGET_SIZE (BSTR, 2) + TEST_TARGET_ALIGN(BSTR, 2) +} + +static void test_pack_BSTRBLOB(void) +{ + /* BSTRBLOB */ + TEST_TYPE_SIZE (BSTRBLOB, 16) + TEST_TYPE_ALIGN (BSTRBLOB, 8) + TEST_FIELD_SIZE (BSTRBLOB, cbSize, 4) + TEST_FIELD_ALIGN (BSTRBLOB, cbSize, 4) + TEST_FIELD_OFFSET(BSTRBLOB, cbSize, 0) + TEST_FIELD_SIZE (BSTRBLOB, pData, 8) + TEST_FIELD_ALIGN (BSTRBLOB, pData, 8) + TEST_FIELD_OFFSET(BSTRBLOB, pData, 8) +} + +static void test_pack_BYTE_BLOB(void) +{ + /* BYTE_BLOB */ + TEST_TYPE_SIZE (BYTE_BLOB, 8) + TEST_TYPE_ALIGN (BYTE_BLOB, 4) + TEST_FIELD_SIZE (BYTE_BLOB, clSize, 4) + TEST_FIELD_ALIGN (BYTE_BLOB, clSize, 4) + TEST_FIELD_OFFSET(BYTE_BLOB, clSize, 0) + TEST_FIELD_SIZE (BYTE_BLOB, abData, 1) + TEST_FIELD_ALIGN (BYTE_BLOB, abData, 1) + TEST_FIELD_OFFSET(BYTE_BLOB, abData, 4) +} + +static void test_pack_BYTE_SIZEDARR(void) +{ + /* BYTE_SIZEDARR */ + TEST_TYPE_SIZE (BYTE_SIZEDARR, 16) + TEST_TYPE_ALIGN (BYTE_SIZEDARR, 8) + TEST_FIELD_SIZE (BYTE_SIZEDARR, clSize, 4) + TEST_FIELD_ALIGN (BYTE_SIZEDARR, clSize, 4) + TEST_FIELD_OFFSET(BYTE_SIZEDARR, clSize, 0) + TEST_FIELD_SIZE (BYTE_SIZEDARR, pData, 8) + TEST_FIELD_ALIGN (BYTE_SIZEDARR, pData, 8) + TEST_FIELD_OFFSET(BYTE_SIZEDARR, pData, 8) +} + +static void test_pack_CLIPDATA(void) +{ + /* CLIPDATA */ + TEST_TYPE_SIZE (CLIPDATA, 16) + TEST_TYPE_ALIGN (CLIPDATA, 8) + TEST_FIELD_SIZE (CLIPDATA, cbSize, 4) + TEST_FIELD_ALIGN (CLIPDATA, cbSize, 4) + TEST_FIELD_OFFSET(CLIPDATA, cbSize, 0) + TEST_FIELD_SIZE (CLIPDATA, ulClipFmt, 4) + TEST_FIELD_ALIGN (CLIPDATA, ulClipFmt, 4) + TEST_FIELD_OFFSET(CLIPDATA, ulClipFmt, 4) + TEST_FIELD_SIZE (CLIPDATA, pClipData, 8) + TEST_FIELD_ALIGN (CLIPDATA, pClipData, 8) + TEST_FIELD_OFFSET(CLIPDATA, pClipData, 8) +} + +static void test_pack_CLIPFORMAT(void) +{ + /* CLIPFORMAT */ + TEST_TYPE_SIZE (CLIPFORMAT, 2) + TEST_TYPE_ALIGN (CLIPFORMAT, 2) + TEST_TYPE_UNSIGNED(CLIPFORMAT) +} + +static void test_pack_COAUTHIDENTITY(void) +{ + /* COAUTHIDENTITY */ + TEST_TYPE_SIZE (COAUTHIDENTITY, 48) + TEST_TYPE_ALIGN (COAUTHIDENTITY, 8) + TEST_FIELD_SIZE (COAUTHIDENTITY, User, 8) + TEST_FIELD_ALIGN (COAUTHIDENTITY, User, 8) + TEST_FIELD_OFFSET(COAUTHIDENTITY, User, 0) + TEST_FIELD_SIZE (COAUTHIDENTITY, UserLength, 4) + TEST_FIELD_ALIGN (COAUTHIDENTITY, UserLength, 4) + TEST_FIELD_OFFSET(COAUTHIDENTITY, UserLength, 8) + TEST_FIELD_SIZE (COAUTHIDENTITY, Domain, 8) + TEST_FIELD_ALIGN (COAUTHIDENTITY, Domain, 8) + TEST_FIELD_OFFSET(COAUTHIDENTITY, Domain, 16) + TEST_FIELD_SIZE (COAUTHIDENTITY, DomainLength, 4) + TEST_FIELD_ALIGN (COAUTHIDENTITY, DomainLength, 4) + TEST_FIELD_OFFSET(COAUTHIDENTITY, DomainLength, 24) + TEST_FIELD_SIZE (COAUTHIDENTITY, Password, 8) + TEST_FIELD_ALIGN (COAUTHIDENTITY, Password, 8) + TEST_FIELD_OFFSET(COAUTHIDENTITY, Password, 32) + TEST_FIELD_SIZE (COAUTHIDENTITY, PasswordLength, 4) + TEST_FIELD_ALIGN (COAUTHIDENTITY, PasswordLength, 4) + TEST_FIELD_OFFSET(COAUTHIDENTITY, PasswordLength, 40) + TEST_FIELD_SIZE (COAUTHIDENTITY, Flags, 4) + TEST_FIELD_ALIGN (COAUTHIDENTITY, Flags, 4) + TEST_FIELD_OFFSET(COAUTHIDENTITY, Flags, 44) +} + +static void test_pack_COAUTHINFO(void) +{ + /* COAUTHINFO */ + TEST_TYPE_SIZE (COAUTHINFO, 40) + TEST_TYPE_ALIGN (COAUTHINFO, 8) + TEST_FIELD_SIZE (COAUTHINFO, dwAuthnSvc, 4) + TEST_FIELD_ALIGN (COAUTHINFO, dwAuthnSvc, 4) + TEST_FIELD_OFFSET(COAUTHINFO, dwAuthnSvc, 0) + TEST_FIELD_SIZE (COAUTHINFO, dwAuthzSvc, 4) + TEST_FIELD_ALIGN (COAUTHINFO, dwAuthzSvc, 4) + TEST_FIELD_OFFSET(COAUTHINFO, dwAuthzSvc, 4) + TEST_FIELD_SIZE (COAUTHINFO, pwszServerPrincName, 8) + TEST_FIELD_ALIGN (COAUTHINFO, pwszServerPrincName, 8) + TEST_FIELD_OFFSET(COAUTHINFO, pwszServerPrincName, 8) + TEST_FIELD_SIZE (COAUTHINFO, dwAuthnLevel, 4) + TEST_FIELD_ALIGN (COAUTHINFO, dwAuthnLevel, 4) + TEST_FIELD_OFFSET(COAUTHINFO, dwAuthnLevel, 16) + TEST_FIELD_SIZE (COAUTHINFO, dwImpersonationLevel, 4) + TEST_FIELD_ALIGN (COAUTHINFO, dwImpersonationLevel, 4) + TEST_FIELD_OFFSET(COAUTHINFO, dwImpersonationLevel, 20) + TEST_FIELD_SIZE (COAUTHINFO, pAuthIdentityData, 8) + TEST_FIELD_ALIGN (COAUTHINFO, pAuthIdentityData, 8) + TEST_FIELD_OFFSET(COAUTHINFO, pAuthIdentityData, 24) + TEST_FIELD_SIZE (COAUTHINFO, dwCapabilities, 4) + TEST_FIELD_ALIGN (COAUTHINFO, dwCapabilities, 4) + TEST_FIELD_OFFSET(COAUTHINFO, dwCapabilities, 32) +} + +static void test_pack_DATE(void) +{ + /* DATE */ + TEST_TYPE_SIZE (DATE, 8) + TEST_TYPE_ALIGN (DATE, 8) +} + +static void test_pack_DOUBLE(void) +{ + /* DOUBLE */ + TEST_TYPE_SIZE (DOUBLE, 8) + TEST_TYPE_ALIGN (DOUBLE, 8) +} + +static void test_pack_DWORD_SIZEDARR(void) +{ + /* DWORD_SIZEDARR */ + TEST_TYPE_SIZE (DWORD_SIZEDARR, 16) + TEST_TYPE_ALIGN (DWORD_SIZEDARR, 8) + TEST_FIELD_SIZE (DWORD_SIZEDARR, clSize, 4) + TEST_FIELD_ALIGN (DWORD_SIZEDARR, clSize, 4) + TEST_FIELD_OFFSET(DWORD_SIZEDARR, clSize, 0) + TEST_FIELD_SIZE (DWORD_SIZEDARR, pData, 8) + TEST_FIELD_ALIGN (DWORD_SIZEDARR, pData, 8) + TEST_FIELD_OFFSET(DWORD_SIZEDARR, pData, 8) +} + +static void test_pack_FLAGGED_BYTE_BLOB(void) +{ + /* FLAGGED_BYTE_BLOB */ + TEST_TYPE_SIZE (FLAGGED_BYTE_BLOB, 12) + TEST_TYPE_ALIGN (FLAGGED_BYTE_BLOB, 4) + TEST_FIELD_SIZE (FLAGGED_BYTE_BLOB, fFlags, 4) + TEST_FIELD_ALIGN (FLAGGED_BYTE_BLOB, fFlags, 4) + TEST_FIELD_OFFSET(FLAGGED_BYTE_BLOB, fFlags, 0) + TEST_FIELD_SIZE (FLAGGED_BYTE_BLOB, clSize, 4) + TEST_FIELD_ALIGN (FLAGGED_BYTE_BLOB, clSize, 4) + TEST_FIELD_OFFSET(FLAGGED_BYTE_BLOB, clSize, 4) + TEST_FIELD_SIZE (FLAGGED_BYTE_BLOB, abData, 1) + TEST_FIELD_ALIGN (FLAGGED_BYTE_BLOB, abData, 1) + TEST_FIELD_OFFSET(FLAGGED_BYTE_BLOB, abData, 8) +} + +static void test_pack_FLAGGED_WORD_BLOB(void) +{ + /* FLAGGED_WORD_BLOB */ + TEST_TYPE_SIZE (FLAGGED_WORD_BLOB, 12) + TEST_TYPE_ALIGN (FLAGGED_WORD_BLOB, 4) + TEST_FIELD_SIZE (FLAGGED_WORD_BLOB, fFlags, 4) + TEST_FIELD_ALIGN (FLAGGED_WORD_BLOB, fFlags, 4) + TEST_FIELD_OFFSET(FLAGGED_WORD_BLOB, fFlags, 0) + TEST_FIELD_SIZE (FLAGGED_WORD_BLOB, clSize, 4) + TEST_FIELD_ALIGN (FLAGGED_WORD_BLOB, clSize, 4) + TEST_FIELD_OFFSET(FLAGGED_WORD_BLOB, clSize, 4) + TEST_FIELD_SIZE (FLAGGED_WORD_BLOB, asData, 2) + TEST_FIELD_ALIGN (FLAGGED_WORD_BLOB, asData, 2) + TEST_FIELD_OFFSET(FLAGGED_WORD_BLOB, asData, 8) +} + +static void test_pack_HMETAFILEPICT(void) +{ + /* HMETAFILEPICT */ + TEST_TYPE_SIZE (HMETAFILEPICT, 8) + TEST_TYPE_ALIGN (HMETAFILEPICT, 8) +} + +static void test_pack_HYPER_SIZEDARR(void) +{ + /* HYPER_SIZEDARR */ + TEST_TYPE_SIZE (HYPER_SIZEDARR, 16) + TEST_TYPE_ALIGN (HYPER_SIZEDARR, 8) + TEST_FIELD_SIZE (HYPER_SIZEDARR, clSize, 4) + TEST_FIELD_ALIGN (HYPER_SIZEDARR, clSize, 4) + TEST_FIELD_OFFSET(HYPER_SIZEDARR, clSize, 0) + TEST_FIELD_SIZE (HYPER_SIZEDARR, pData, 8) + TEST_FIELD_ALIGN (HYPER_SIZEDARR, pData, 8) + TEST_FIELD_OFFSET(HYPER_SIZEDARR, pData, 8) +} + +static void test_pack_LPBLOB(void) +{ + /* LPBLOB */ + TEST_TYPE_SIZE (LPBLOB, 8) + TEST_TYPE_ALIGN (LPBLOB, 8) +} + +static void test_pack_LPBSTR(void) +{ + /* LPBSTR */ + TEST_TYPE_SIZE (LPBSTR, 8) + TEST_TYPE_ALIGN (LPBSTR, 8) + TEST_TARGET_SIZE (LPBSTR, 8) + TEST_TARGET_ALIGN(LPBSTR, 8) +} + +static void test_pack_LPBSTRBLOB(void) +{ + /* LPBSTRBLOB */ + TEST_TYPE_SIZE (LPBSTRBLOB, 8) + TEST_TYPE_ALIGN (LPBSTRBLOB, 8) +} + +static void test_pack_LPCOLESTR(void) +{ + /* LPCOLESTR */ + TEST_TYPE_SIZE (LPCOLESTR, 8) + TEST_TYPE_ALIGN (LPCOLESTR, 8) + TEST_TARGET_SIZE (LPCOLESTR, 2) + TEST_TARGET_ALIGN(LPCOLESTR, 2) +} + +static void test_pack_LPCY(void) +{ + /* LPCY */ + TEST_TYPE_SIZE (LPCY, 8) + TEST_TYPE_ALIGN (LPCY, 8) +} + +static void test_pack_LPDECIMAL(void) +{ + /* LPDECIMAL */ + TEST_TYPE_SIZE (LPDECIMAL, 8) + TEST_TYPE_ALIGN (LPDECIMAL, 8) +} + +static void test_pack_LPOLESTR(void) +{ + /* LPOLESTR */ + TEST_TYPE_SIZE (LPOLESTR, 8) + TEST_TYPE_ALIGN (LPOLESTR, 8) + TEST_TARGET_SIZE (LPOLESTR, 2) + TEST_TARGET_ALIGN(LPOLESTR, 2) +} + +static void test_pack_OLECHAR(void) +{ + /* OLECHAR */ + TEST_TYPE_SIZE (OLECHAR, 2) + TEST_TYPE_ALIGN (OLECHAR, 2) +} + +static void test_pack_PROPID(void) +{ + /* PROPID */ + TEST_TYPE_SIZE (PROPID, 4) + TEST_TYPE_ALIGN (PROPID, 4) +} + +static void test_pack_RemHBITMAP(void) +{ + /* RemHBITMAP */ + TEST_TYPE_SIZE (RemHBITMAP, 8) + TEST_TYPE_ALIGN (RemHBITMAP, 4) + TEST_FIELD_SIZE (RemHBITMAP, cbData, 4) + TEST_FIELD_ALIGN (RemHBITMAP, cbData, 4) + TEST_FIELD_OFFSET(RemHBITMAP, cbData, 0) + TEST_FIELD_SIZE (RemHBITMAP, data, 1) + TEST_FIELD_ALIGN (RemHBITMAP, data, 1) + TEST_FIELD_OFFSET(RemHBITMAP, data, 4) +} + +static void test_pack_RemHENHMETAFILE(void) +{ + /* RemHENHMETAFILE */ + TEST_TYPE_SIZE (RemHENHMETAFILE, 8) + TEST_TYPE_ALIGN (RemHENHMETAFILE, 4) + TEST_FIELD_SIZE (RemHENHMETAFILE, cbData, 4) + TEST_FIELD_ALIGN (RemHENHMETAFILE, cbData, 4) + TEST_FIELD_OFFSET(RemHENHMETAFILE, cbData, 0) + TEST_FIELD_SIZE (RemHENHMETAFILE, data, 1) + TEST_FIELD_ALIGN (RemHENHMETAFILE, data, 1) + TEST_FIELD_OFFSET(RemHENHMETAFILE, data, 4) +} + +static void test_pack_RemHGLOBAL(void) +{ + /* RemHGLOBAL */ + TEST_TYPE_SIZE (RemHGLOBAL, 12) + TEST_TYPE_ALIGN (RemHGLOBAL, 4) + TEST_FIELD_SIZE (RemHGLOBAL, fNullHGlobal, 4) + TEST_FIELD_ALIGN (RemHGLOBAL, fNullHGlobal, 4) + TEST_FIELD_OFFSET(RemHGLOBAL, fNullHGlobal, 0) + TEST_FIELD_SIZE (RemHGLOBAL, cbData, 4) + TEST_FIELD_ALIGN (RemHGLOBAL, cbData, 4) + TEST_FIELD_OFFSET(RemHGLOBAL, cbData, 4) + TEST_FIELD_SIZE (RemHGLOBAL, data, 1) + TEST_FIELD_ALIGN (RemHGLOBAL, data, 1) + TEST_FIELD_OFFSET(RemHGLOBAL, data, 8) +} + +static void test_pack_RemHMETAFILEPICT(void) +{ + /* RemHMETAFILEPICT */ + TEST_TYPE_SIZE (RemHMETAFILEPICT, 20) + TEST_TYPE_ALIGN (RemHMETAFILEPICT, 4) + TEST_FIELD_SIZE (RemHMETAFILEPICT, mm, 4) + TEST_FIELD_ALIGN (RemHMETAFILEPICT, mm, 4) + TEST_FIELD_OFFSET(RemHMETAFILEPICT, mm, 0) + TEST_FIELD_SIZE (RemHMETAFILEPICT, xExt, 4) + TEST_FIELD_ALIGN (RemHMETAFILEPICT, xExt, 4) + TEST_FIELD_OFFSET(RemHMETAFILEPICT, xExt, 4) + TEST_FIELD_SIZE (RemHMETAFILEPICT, yExt, 4) + TEST_FIELD_ALIGN (RemHMETAFILEPICT, yExt, 4) + TEST_FIELD_OFFSET(RemHMETAFILEPICT, yExt, 8) + TEST_FIELD_SIZE (RemHMETAFILEPICT, cbData, 4) + TEST_FIELD_ALIGN (RemHMETAFILEPICT, cbData, 4) + TEST_FIELD_OFFSET(RemHMETAFILEPICT, cbData, 12) + TEST_FIELD_SIZE (RemHMETAFILEPICT, data, 1) + TEST_FIELD_ALIGN (RemHMETAFILEPICT, data, 1) + TEST_FIELD_OFFSET(RemHMETAFILEPICT, data, 16) +} + +static void test_pack_RemHPALETTE(void) +{ + /* RemHPALETTE */ + TEST_TYPE_SIZE (RemHPALETTE, 8) + TEST_TYPE_ALIGN (RemHPALETTE, 4) + TEST_FIELD_SIZE (RemHPALETTE, cbData, 4) + TEST_FIELD_ALIGN (RemHPALETTE, cbData, 4) + TEST_FIELD_OFFSET(RemHPALETTE, cbData, 0) + TEST_FIELD_SIZE (RemHPALETTE, data, 1) + TEST_FIELD_ALIGN (RemHPALETTE, data, 1) + TEST_FIELD_OFFSET(RemHPALETTE, data, 4) +} + +static void test_pack_SCODE(void) +{ + /* SCODE */ + TEST_TYPE_SIZE (SCODE, 4) + TEST_TYPE_ALIGN (SCODE, 4) +} + +static void test_pack_UP_BYTE_BLOB(void) +{ + /* UP_BYTE_BLOB */ + TEST_TYPE_SIZE (UP_BYTE_BLOB, 8) + TEST_TYPE_ALIGN (UP_BYTE_BLOB, 8) + TEST_TARGET_SIZE (UP_BYTE_BLOB, 8) + TEST_TARGET_ALIGN(UP_BYTE_BLOB, 4) +} + +static void test_pack_UP_FLAGGED_BYTE_BLOB(void) +{ + /* UP_FLAGGED_BYTE_BLOB */ + TEST_TYPE_SIZE (UP_FLAGGED_BYTE_BLOB, 8) + TEST_TYPE_ALIGN (UP_FLAGGED_BYTE_BLOB, 8) + TEST_TARGET_SIZE (UP_FLAGGED_BYTE_BLOB, 12) + TEST_TARGET_ALIGN(UP_FLAGGED_BYTE_BLOB, 4) +} + +static void test_pack_UP_FLAGGED_WORD_BLOB(void) +{ + /* UP_FLAGGED_WORD_BLOB */ + TEST_TYPE_SIZE (UP_FLAGGED_WORD_BLOB, 8) + TEST_TYPE_ALIGN (UP_FLAGGED_WORD_BLOB, 8) + TEST_TARGET_SIZE (UP_FLAGGED_WORD_BLOB, 12) + TEST_TARGET_ALIGN(UP_FLAGGED_WORD_BLOB, 4) +} + +static void test_pack_VARIANT_BOOL(void) +{ + /* VARIANT_BOOL */ + TEST_TYPE_SIZE (VARIANT_BOOL, 2) + TEST_TYPE_ALIGN (VARIANT_BOOL, 2) + TEST_TYPE_SIGNED(VARIANT_BOOL) +} + +static void test_pack_VARTYPE(void) +{ + /* VARTYPE */ + TEST_TYPE_SIZE (VARTYPE, 2) + TEST_TYPE_ALIGN (VARTYPE, 2) + TEST_TYPE_UNSIGNED(VARTYPE) +} + +static void test_pack_WORD_SIZEDARR(void) +{ + /* WORD_SIZEDARR */ + TEST_TYPE_SIZE (WORD_SIZEDARR, 16) + TEST_TYPE_ALIGN (WORD_SIZEDARR, 8) + TEST_FIELD_SIZE (WORD_SIZEDARR, clSize, 4) + TEST_FIELD_ALIGN (WORD_SIZEDARR, clSize, 4) + TEST_FIELD_OFFSET(WORD_SIZEDARR, clSize, 0) + TEST_FIELD_SIZE (WORD_SIZEDARR, pData, 8) + TEST_FIELD_ALIGN (WORD_SIZEDARR, pData, 8) + TEST_FIELD_OFFSET(WORD_SIZEDARR, pData, 8) +} + +static void test_pack_remoteMETAFILEPICT(void) +{ + /* remoteMETAFILEPICT */ + TEST_TYPE_SIZE (remoteMETAFILEPICT, 24) + TEST_TYPE_ALIGN (remoteMETAFILEPICT, 8) + TEST_FIELD_SIZE (remoteMETAFILEPICT, mm, 4) + TEST_FIELD_ALIGN (remoteMETAFILEPICT, mm, 4) + TEST_FIELD_OFFSET(remoteMETAFILEPICT, mm, 0) + TEST_FIELD_SIZE (remoteMETAFILEPICT, xExt, 4) + TEST_FIELD_ALIGN (remoteMETAFILEPICT, xExt, 4) + TEST_FIELD_OFFSET(remoteMETAFILEPICT, xExt, 4) + TEST_FIELD_SIZE (remoteMETAFILEPICT, yExt, 4) + TEST_FIELD_ALIGN (remoteMETAFILEPICT, yExt, 4) + TEST_FIELD_OFFSET(remoteMETAFILEPICT, yExt, 8) + TEST_FIELD_SIZE (remoteMETAFILEPICT, hMF, 8) + TEST_FIELD_ALIGN (remoteMETAFILEPICT, hMF, 8) + TEST_FIELD_OFFSET(remoteMETAFILEPICT, hMF, 16) +} + +static void test_pack_userBITMAP(void) +{ + /* userBITMAP */ + TEST_TYPE_SIZE (userBITMAP, 28) + TEST_TYPE_ALIGN (userBITMAP, 4) + TEST_FIELD_SIZE (userBITMAP, bmType, 4) + TEST_FIELD_ALIGN (userBITMAP, bmType, 4) + TEST_FIELD_OFFSET(userBITMAP, bmType, 0) + TEST_FIELD_SIZE (userBITMAP, bmWidth, 4) + TEST_FIELD_ALIGN (userBITMAP, bmWidth, 4) + TEST_FIELD_OFFSET(userBITMAP, bmWidth, 4) + TEST_FIELD_SIZE (userBITMAP, bmHeight, 4) + TEST_FIELD_ALIGN (userBITMAP, bmHeight, 4) + TEST_FIELD_OFFSET(userBITMAP, bmHeight, 8) + TEST_FIELD_SIZE (userBITMAP, bmWidthBytes, 4) + TEST_FIELD_ALIGN (userBITMAP, bmWidthBytes, 4) + TEST_FIELD_OFFSET(userBITMAP, bmWidthBytes, 12) + TEST_FIELD_SIZE (userBITMAP, bmPlanes, 2) + TEST_FIELD_ALIGN (userBITMAP, bmPlanes, 2) + TEST_FIELD_OFFSET(userBITMAP, bmPlanes, 16) + TEST_FIELD_SIZE (userBITMAP, bmBitsPixel, 2) + TEST_FIELD_ALIGN (userBITMAP, bmBitsPixel, 2) + TEST_FIELD_OFFSET(userBITMAP, bmBitsPixel, 18) + TEST_FIELD_SIZE (userBITMAP, cbSize, 4) + TEST_FIELD_ALIGN (userBITMAP, cbSize, 4) + TEST_FIELD_OFFSET(userBITMAP, cbSize, 20) + TEST_FIELD_SIZE (userBITMAP, pBuffer, 1) + TEST_FIELD_ALIGN (userBITMAP, pBuffer, 1) + TEST_FIELD_OFFSET(userBITMAP, pBuffer, 24) +} + +static void test_pack_userCLIPFORMAT(void) +{ + /* userCLIPFORMAT */ + TEST_FIELD_SIZE (userCLIPFORMAT, fContext, 4) + TEST_FIELD_ALIGN (userCLIPFORMAT, fContext, 4) + TEST_FIELD_OFFSET(userCLIPFORMAT, fContext, 0) +} + +static void test_pack_userHBITMAP(void) +{ + /* userHBITMAP */ + TEST_FIELD_SIZE (userHBITMAP, fContext, 4) + TEST_FIELD_ALIGN (userHBITMAP, fContext, 4) + TEST_FIELD_OFFSET(userHBITMAP, fContext, 0) +} + +static void test_pack_userHENHMETAFILE(void) +{ + /* userHENHMETAFILE */ + TEST_FIELD_SIZE (userHENHMETAFILE, fContext, 4) + TEST_FIELD_ALIGN (userHENHMETAFILE, fContext, 4) + TEST_FIELD_OFFSET(userHENHMETAFILE, fContext, 0) +} + +static void test_pack_userHGLOBAL(void) +{ + /* userHGLOBAL */ + TEST_FIELD_SIZE (userHGLOBAL, fContext, 4) + TEST_FIELD_ALIGN (userHGLOBAL, fContext, 4) + TEST_FIELD_OFFSET(userHGLOBAL, fContext, 0) +} + +static void test_pack_userHMETAFILE(void) +{ + /* userHMETAFILE */ + TEST_FIELD_SIZE (userHMETAFILE, fContext, 4) + TEST_FIELD_ALIGN (userHMETAFILE, fContext, 4) + TEST_FIELD_OFFSET(userHMETAFILE, fContext, 0) +} + +static void test_pack_userHMETAFILEPICT(void) +{ + /* userHMETAFILEPICT */ + TEST_FIELD_SIZE (userHMETAFILEPICT, fContext, 4) + TEST_FIELD_ALIGN (userHMETAFILEPICT, fContext, 4) + TEST_FIELD_OFFSET(userHMETAFILEPICT, fContext, 0) +} + +static void test_pack_userHPALETTE(void) +{ + /* userHPALETTE */ + TEST_FIELD_SIZE (userHPALETTE, fContext, 4) + TEST_FIELD_ALIGN (userHPALETTE, fContext, 4) + TEST_FIELD_OFFSET(userHPALETTE, fContext, 0) +} + +static void test_pack_wireBSTR(void) +{ + /* wireBSTR */ + TEST_TYPE_SIZE (wireBSTR, 8) + TEST_TYPE_ALIGN (wireBSTR, 8) + TEST_TARGET_SIZE (wireBSTR, 12) + TEST_TARGET_ALIGN(wireBSTR, 4) +} + +static void test_pack_wireCLIPFORMAT(void) +{ + /* wireCLIPFORMAT */ + TEST_TYPE_SIZE (wireCLIPFORMAT, 8) + TEST_TYPE_ALIGN (wireCLIPFORMAT, 8) +} + +static void test_pack_wireHBITMAP(void) +{ + /* wireHBITMAP */ + TEST_TYPE_SIZE (wireHBITMAP, 8) + TEST_TYPE_ALIGN (wireHBITMAP, 8) +} + +static void test_pack_wireHENHMETAFILE(void) +{ + /* wireHENHMETAFILE */ + TEST_TYPE_SIZE (wireHENHMETAFILE, 8) + TEST_TYPE_ALIGN (wireHENHMETAFILE, 8) +} + +static void test_pack_wireHGLOBAL(void) +{ + /* wireHGLOBAL */ + TEST_TYPE_SIZE (wireHGLOBAL, 8) + TEST_TYPE_ALIGN (wireHGLOBAL, 8) +} + +static void test_pack_wireHMETAFILE(void) +{ + /* wireHMETAFILE */ + TEST_TYPE_SIZE (wireHMETAFILE, 8) + TEST_TYPE_ALIGN (wireHMETAFILE, 8) +} + +static void test_pack_wireHMETAFILEPICT(void) +{ + /* wireHMETAFILEPICT */ + TEST_TYPE_SIZE (wireHMETAFILEPICT, 8) + TEST_TYPE_ALIGN (wireHMETAFILEPICT, 8) +} + +static void test_pack_wireHPALETTE(void) +{ + /* wireHPALETTE */ + TEST_TYPE_SIZE (wireHPALETTE, 8) + TEST_TYPE_ALIGN (wireHPALETTE, 8) +} + +static void test_pack_CLSID(void) +{ + /* CLSID */ + TEST_TYPE_SIZE (CLSID, 16) + TEST_TYPE_ALIGN (CLSID, 4) +} + +static void test_pack_FMTID(void) +{ + /* FMTID */ + TEST_TYPE_SIZE (FMTID, 16) + TEST_TYPE_ALIGN (FMTID, 4) +} + +static void test_pack_IID(void) +{ + /* IID */ + TEST_TYPE_SIZE (IID, 16) + TEST_TYPE_ALIGN (IID, 4) +} + +static void test_pack_APPBARDATA(void) +{ + /* APPBARDATA */ + TEST_TYPE_SIZE (APPBARDATA, 48) + TEST_TYPE_ALIGN (APPBARDATA, 8) + TEST_FIELD_SIZE (APPBARDATA, cbSize, 4) + TEST_FIELD_ALIGN (APPBARDATA, cbSize, 4) + TEST_FIELD_OFFSET(APPBARDATA, cbSize, 0) + TEST_FIELD_SIZE (APPBARDATA, hWnd, 8) + TEST_FIELD_ALIGN (APPBARDATA, hWnd, 8) + TEST_FIELD_OFFSET(APPBARDATA, hWnd, 8) + TEST_FIELD_SIZE (APPBARDATA, uCallbackMessage, 4) + TEST_FIELD_ALIGN (APPBARDATA, uCallbackMessage, 4) + TEST_FIELD_OFFSET(APPBARDATA, uCallbackMessage, 16) + TEST_FIELD_SIZE (APPBARDATA, uEdge, 4) + TEST_FIELD_ALIGN (APPBARDATA, uEdge, 4) + TEST_FIELD_OFFSET(APPBARDATA, uEdge, 20) + TEST_FIELD_SIZE (APPBARDATA, rc, 16) + TEST_FIELD_ALIGN (APPBARDATA, rc, 4) + TEST_FIELD_OFFSET(APPBARDATA, rc, 24) + TEST_FIELD_SIZE (APPBARDATA, lParam, 8) + TEST_FIELD_ALIGN (APPBARDATA, lParam, 8) + TEST_FIELD_OFFSET(APPBARDATA, lParam, 40) +} + +static void test_pack_DRAGINFOA(void) +{ + /* DRAGINFOA */ + TEST_TYPE_SIZE (DRAGINFOA, 32) + TEST_TYPE_ALIGN (DRAGINFOA, 8) + TEST_FIELD_SIZE (DRAGINFOA, uSize, 4) + TEST_FIELD_ALIGN (DRAGINFOA, uSize, 4) + TEST_FIELD_OFFSET(DRAGINFOA, uSize, 0) + TEST_FIELD_SIZE (DRAGINFOA, pt, 8) + TEST_FIELD_ALIGN (DRAGINFOA, pt, 4) + TEST_FIELD_OFFSET(DRAGINFOA, pt, 4) + TEST_FIELD_SIZE (DRAGINFOA, fNC, 4) + TEST_FIELD_ALIGN (DRAGINFOA, fNC, 4) + TEST_FIELD_OFFSET(DRAGINFOA, fNC, 12) + TEST_FIELD_SIZE (DRAGINFOA, lpFileList, 8) + TEST_FIELD_ALIGN (DRAGINFOA, lpFileList, 8) + TEST_FIELD_OFFSET(DRAGINFOA, lpFileList, 16) + TEST_FIELD_SIZE (DRAGINFOA, grfKeyState, 4) + TEST_FIELD_ALIGN (DRAGINFOA, grfKeyState, 4) + TEST_FIELD_OFFSET(DRAGINFOA, grfKeyState, 24) +} + +static void test_pack_DRAGINFOW(void) +{ + /* DRAGINFOW */ + TEST_TYPE_SIZE (DRAGINFOW, 32) + TEST_TYPE_ALIGN (DRAGINFOW, 8) + TEST_FIELD_SIZE (DRAGINFOW, uSize, 4) + TEST_FIELD_ALIGN (DRAGINFOW, uSize, 4) + TEST_FIELD_OFFSET(DRAGINFOW, uSize, 0) + TEST_FIELD_SIZE (DRAGINFOW, pt, 8) + TEST_FIELD_ALIGN (DRAGINFOW, pt, 4) + TEST_FIELD_OFFSET(DRAGINFOW, pt, 4) + TEST_FIELD_SIZE (DRAGINFOW, fNC, 4) + TEST_FIELD_ALIGN (DRAGINFOW, fNC, 4) + TEST_FIELD_OFFSET(DRAGINFOW, fNC, 12) + TEST_FIELD_SIZE (DRAGINFOW, lpFileList, 8) + TEST_FIELD_ALIGN (DRAGINFOW, lpFileList, 8) + TEST_FIELD_OFFSET(DRAGINFOW, lpFileList, 16) + TEST_FIELD_SIZE (DRAGINFOW, grfKeyState, 4) + TEST_FIELD_ALIGN (DRAGINFOW, grfKeyState, 4) + TEST_FIELD_OFFSET(DRAGINFOW, grfKeyState, 24) +} + +static void test_pack_FILEOP_FLAGS(void) +{ + /* FILEOP_FLAGS */ + TEST_TYPE_SIZE (FILEOP_FLAGS, 2) + TEST_TYPE_ALIGN (FILEOP_FLAGS, 2) + TEST_TYPE_UNSIGNED(FILEOP_FLAGS) +} + +static void test_pack_LPDRAGINFOA(void) +{ + /* LPDRAGINFOA */ + TEST_TYPE_SIZE (LPDRAGINFOA, 8) + TEST_TYPE_ALIGN (LPDRAGINFOA, 8) + TEST_TARGET_SIZE (LPDRAGINFOA, 32) + TEST_TARGET_ALIGN(LPDRAGINFOA, 8) +} + +static void test_pack_LPDRAGINFOW(void) +{ + /* LPDRAGINFOW */ + TEST_TYPE_SIZE (LPDRAGINFOW, 8) + TEST_TYPE_ALIGN (LPDRAGINFOW, 8) + TEST_TARGET_SIZE (LPDRAGINFOW, 32) + TEST_TARGET_ALIGN(LPDRAGINFOW, 8) +} + +static void test_pack_LPSHELLEXECUTEINFOA(void) +{ + /* LPSHELLEXECUTEINFOA */ + TEST_TYPE_SIZE (LPSHELLEXECUTEINFOA, 8) + TEST_TYPE_ALIGN (LPSHELLEXECUTEINFOA, 8) +} + +static void test_pack_LPSHELLEXECUTEINFOW(void) +{ + /* LPSHELLEXECUTEINFOW */ + TEST_TYPE_SIZE (LPSHELLEXECUTEINFOW, 8) + TEST_TYPE_ALIGN (LPSHELLEXECUTEINFOW, 8) +} + +static void test_pack_LPSHFILEOPSTRUCTA(void) +{ + /* LPSHFILEOPSTRUCTA */ + TEST_TYPE_SIZE (LPSHFILEOPSTRUCTA, 8) + TEST_TYPE_ALIGN (LPSHFILEOPSTRUCTA, 8) + TEST_TARGET_SIZE (LPSHFILEOPSTRUCTA, 56) + TEST_TARGET_ALIGN(LPSHFILEOPSTRUCTA, 8) +} + +static void test_pack_LPSHFILEOPSTRUCTW(void) +{ + /* LPSHFILEOPSTRUCTW */ + TEST_TYPE_SIZE (LPSHFILEOPSTRUCTW, 8) + TEST_TYPE_ALIGN (LPSHFILEOPSTRUCTW, 8) + TEST_TARGET_SIZE (LPSHFILEOPSTRUCTW, 56) + TEST_TARGET_ALIGN(LPSHFILEOPSTRUCTW, 8) +} + +static void test_pack_LPSHNAMEMAPPINGA(void) +{ + /* LPSHNAMEMAPPINGA */ + TEST_TYPE_SIZE (LPSHNAMEMAPPINGA, 8) + TEST_TYPE_ALIGN (LPSHNAMEMAPPINGA, 8) + TEST_TARGET_SIZE (LPSHNAMEMAPPINGA, 24) + TEST_TARGET_ALIGN(LPSHNAMEMAPPINGA, 8) +} + +static void test_pack_LPSHNAMEMAPPINGW(void) +{ + /* LPSHNAMEMAPPINGW */ + TEST_TYPE_SIZE (LPSHNAMEMAPPINGW, 8) + TEST_TYPE_ALIGN (LPSHNAMEMAPPINGW, 8) + TEST_TARGET_SIZE (LPSHNAMEMAPPINGW, 24) + TEST_TARGET_ALIGN(LPSHNAMEMAPPINGW, 8) +} + +static void test_pack_NOTIFYICONDATAA(void) +{ + /* NOTIFYICONDATAA */ + TEST_FIELD_SIZE (NOTIFYICONDATAA, cbSize, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, cbSize, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, cbSize, 0) + TEST_FIELD_SIZE (NOTIFYICONDATAA, hWnd, 8) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, hWnd, 8) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, hWnd, 8) + TEST_FIELD_SIZE (NOTIFYICONDATAA, uID, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, uID, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, uID, 16) + TEST_FIELD_SIZE (NOTIFYICONDATAA, uFlags, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, uFlags, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, uFlags, 20) + TEST_FIELD_SIZE (NOTIFYICONDATAA, uCallbackMessage, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, uCallbackMessage, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, uCallbackMessage, 24) + TEST_FIELD_SIZE (NOTIFYICONDATAA, hIcon, 8) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, hIcon, 8) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, hIcon, 32) + TEST_FIELD_SIZE (NOTIFYICONDATAA, szTip, 128) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, szTip, 1) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, szTip, 40) + TEST_FIELD_SIZE (NOTIFYICONDATAA, dwState, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, dwState, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, dwState, 168) + TEST_FIELD_SIZE (NOTIFYICONDATAA, dwStateMask, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, dwStateMask, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, dwStateMask, 172) + TEST_FIELD_SIZE (NOTIFYICONDATAA, szInfo, 256) + TEST_FIELD_ALIGN (NOTIFYICONDATAA, szInfo, 1) + TEST_FIELD_OFFSET(NOTIFYICONDATAA, szInfo, 176) +} + +static void test_pack_NOTIFYICONDATAW(void) +{ + /* NOTIFYICONDATAW */ + TEST_FIELD_SIZE (NOTIFYICONDATAW, cbSize, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, cbSize, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, cbSize, 0) + TEST_FIELD_SIZE (NOTIFYICONDATAW, hWnd, 8) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, hWnd, 8) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, hWnd, 8) + TEST_FIELD_SIZE (NOTIFYICONDATAW, uID, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, uID, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, uID, 16) + TEST_FIELD_SIZE (NOTIFYICONDATAW, uFlags, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, uFlags, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, uFlags, 20) + TEST_FIELD_SIZE (NOTIFYICONDATAW, uCallbackMessage, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, uCallbackMessage, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, uCallbackMessage, 24) + TEST_FIELD_SIZE (NOTIFYICONDATAW, hIcon, 8) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, hIcon, 8) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, hIcon, 32) + TEST_FIELD_SIZE (NOTIFYICONDATAW, szTip, 256) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, szTip, 2) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, szTip, 40) + TEST_FIELD_SIZE (NOTIFYICONDATAW, dwState, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, dwState, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, dwState, 296) + TEST_FIELD_SIZE (NOTIFYICONDATAW, dwStateMask, 4) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, dwStateMask, 4) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, dwStateMask, 300) + TEST_FIELD_SIZE (NOTIFYICONDATAW, szInfo, 512) + TEST_FIELD_ALIGN (NOTIFYICONDATAW, szInfo, 2) + TEST_FIELD_OFFSET(NOTIFYICONDATAW, szInfo, 304) +} + +static void test_pack_PAPPBARDATA(void) +{ + /* PAPPBARDATA */ + TEST_TYPE_SIZE (PAPPBARDATA, 8) + TEST_TYPE_ALIGN (PAPPBARDATA, 8) + TEST_TARGET_SIZE (PAPPBARDATA, 48) + TEST_TARGET_ALIGN(PAPPBARDATA, 8) +} + +static void test_pack_PNOTIFYICONDATAA(void) +{ + /* PNOTIFYICONDATAA */ + TEST_TYPE_SIZE (PNOTIFYICONDATAA, 8) + TEST_TYPE_ALIGN (PNOTIFYICONDATAA, 8) +} + +static void test_pack_PNOTIFYICONDATAW(void) +{ + /* PNOTIFYICONDATAW */ + TEST_TYPE_SIZE (PNOTIFYICONDATAW, 8) + TEST_TYPE_ALIGN (PNOTIFYICONDATAW, 8) +} + +static void test_pack_PRINTEROP_FLAGS(void) +{ + /* PRINTEROP_FLAGS */ + TEST_TYPE_SIZE (PRINTEROP_FLAGS, 2) + TEST_TYPE_ALIGN (PRINTEROP_FLAGS, 2) + TEST_TYPE_UNSIGNED(PRINTEROP_FLAGS) +} + +static void test_pack_SHELLEXECUTEINFOA(void) +{ + /* SHELLEXECUTEINFOA */ + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, cbSize, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, cbSize, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, cbSize, 0) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, fMask, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, fMask, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, fMask, 4) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, hwnd, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, hwnd, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, hwnd, 8) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, lpVerb, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, lpVerb, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, lpVerb, 16) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, lpFile, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, lpFile, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, lpFile, 24) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, lpParameters, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, lpParameters, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, lpParameters, 32) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, lpDirectory, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, lpDirectory, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, lpDirectory, 40) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, nShow, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, nShow, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, nShow, 48) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, hInstApp, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, hInstApp, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, hInstApp, 56) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, lpIDList, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, lpIDList, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, lpIDList, 64) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, lpClass, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, lpClass, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, lpClass, 72) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, hkeyClass, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, hkeyClass, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, hkeyClass, 80) + TEST_FIELD_SIZE (SHELLEXECUTEINFOA, dwHotKey, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOA, dwHotKey, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOA, dwHotKey, 88) +} + +static void test_pack_SHELLEXECUTEINFOW(void) +{ + /* SHELLEXECUTEINFOW */ + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, cbSize, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, cbSize, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, cbSize, 0) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, fMask, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, fMask, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, fMask, 4) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, hwnd, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, hwnd, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, hwnd, 8) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, lpVerb, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, lpVerb, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, lpVerb, 16) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, lpFile, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, lpFile, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, lpFile, 24) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, lpParameters, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, lpParameters, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, lpParameters, 32) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, lpDirectory, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, lpDirectory, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, lpDirectory, 40) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, nShow, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, nShow, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, nShow, 48) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, hInstApp, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, hInstApp, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, hInstApp, 56) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, lpIDList, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, lpIDList, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, lpIDList, 64) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, lpClass, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, lpClass, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, lpClass, 72) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, hkeyClass, 8) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, hkeyClass, 8) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, hkeyClass, 80) + TEST_FIELD_SIZE (SHELLEXECUTEINFOW, dwHotKey, 4) + TEST_FIELD_ALIGN (SHELLEXECUTEINFOW, dwHotKey, 4) + TEST_FIELD_OFFSET(SHELLEXECUTEINFOW, dwHotKey, 88) +} + +static void test_pack_SHFILEINFOA(void) +{ + /* SHFILEINFOA */ + TEST_TYPE_SIZE (SHFILEINFOA, 360) + TEST_TYPE_ALIGN (SHFILEINFOA, 8) + TEST_FIELD_SIZE (SHFILEINFOA, hIcon, 8) + TEST_FIELD_ALIGN (SHFILEINFOA, hIcon, 8) + TEST_FIELD_OFFSET(SHFILEINFOA, hIcon, 0) + TEST_FIELD_SIZE (SHFILEINFOA, iIcon, 4) + TEST_FIELD_ALIGN (SHFILEINFOA, iIcon, 4) + TEST_FIELD_OFFSET(SHFILEINFOA, iIcon, 8) + TEST_FIELD_SIZE (SHFILEINFOA, dwAttributes, 4) + TEST_FIELD_ALIGN (SHFILEINFOA, dwAttributes, 4) + TEST_FIELD_OFFSET(SHFILEINFOA, dwAttributes, 12) + TEST_FIELD_SIZE (SHFILEINFOA, szDisplayName, 260) + TEST_FIELD_ALIGN (SHFILEINFOA, szDisplayName, 1) + TEST_FIELD_OFFSET(SHFILEINFOA, szDisplayName, 16) + TEST_FIELD_SIZE (SHFILEINFOA, szTypeName, 80) + TEST_FIELD_ALIGN (SHFILEINFOA, szTypeName, 1) + TEST_FIELD_OFFSET(SHFILEINFOA, szTypeName, 276) +} + +static void test_pack_SHFILEINFOW(void) +{ + /* SHFILEINFOW */ + TEST_TYPE_SIZE (SHFILEINFOW, 696) + TEST_TYPE_ALIGN (SHFILEINFOW, 8) + TEST_FIELD_SIZE (SHFILEINFOW, hIcon, 8) + TEST_FIELD_ALIGN (SHFILEINFOW, hIcon, 8) + TEST_FIELD_OFFSET(SHFILEINFOW, hIcon, 0) + TEST_FIELD_SIZE (SHFILEINFOW, iIcon, 4) + TEST_FIELD_ALIGN (SHFILEINFOW, iIcon, 4) + TEST_FIELD_OFFSET(SHFILEINFOW, iIcon, 8) + TEST_FIELD_SIZE (SHFILEINFOW, dwAttributes, 4) + TEST_FIELD_ALIGN (SHFILEINFOW, dwAttributes, 4) + TEST_FIELD_OFFSET(SHFILEINFOW, dwAttributes, 12) + TEST_FIELD_SIZE (SHFILEINFOW, szDisplayName, 520) + TEST_FIELD_ALIGN (SHFILEINFOW, szDisplayName, 2) + TEST_FIELD_OFFSET(SHFILEINFOW, szDisplayName, 16) + TEST_FIELD_SIZE (SHFILEINFOW, szTypeName, 160) + TEST_FIELD_ALIGN (SHFILEINFOW, szTypeName, 2) + TEST_FIELD_OFFSET(SHFILEINFOW, szTypeName, 536) +} + +static void test_pack_SHFILEOPSTRUCTA(void) +{ + /* SHFILEOPSTRUCTA */ + TEST_TYPE_SIZE (SHFILEOPSTRUCTA, 56) + TEST_TYPE_ALIGN (SHFILEOPSTRUCTA, 8) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, hwnd, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, hwnd, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, hwnd, 0) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, wFunc, 4) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, wFunc, 4) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, wFunc, 8) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, pFrom, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, pFrom, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, pFrom, 16) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, pTo, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, pTo, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, pTo, 24) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, fFlags, 2) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, fFlags, 2) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, fFlags, 32) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, fAnyOperationsAborted, 4) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, fAnyOperationsAborted, 4) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, fAnyOperationsAborted, 36) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, hNameMappings, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, hNameMappings, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, hNameMappings, 40) + TEST_FIELD_SIZE (SHFILEOPSTRUCTA, lpszProgressTitle, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTA, lpszProgressTitle, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTA, lpszProgressTitle, 48) +} + +static void test_pack_SHFILEOPSTRUCTW(void) +{ + /* SHFILEOPSTRUCTW */ + TEST_TYPE_SIZE (SHFILEOPSTRUCTW, 56) + TEST_TYPE_ALIGN (SHFILEOPSTRUCTW, 8) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, hwnd, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, hwnd, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, hwnd, 0) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, wFunc, 4) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, wFunc, 4) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, wFunc, 8) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, pFrom, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, pFrom, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, pFrom, 16) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, pTo, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, pTo, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, pTo, 24) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, fFlags, 2) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, fFlags, 2) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, fFlags, 32) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, fAnyOperationsAborted, 4) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, fAnyOperationsAborted, 4) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, fAnyOperationsAborted, 36) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, hNameMappings, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, hNameMappings, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, hNameMappings, 40) + TEST_FIELD_SIZE (SHFILEOPSTRUCTW, lpszProgressTitle, 8) + TEST_FIELD_ALIGN (SHFILEOPSTRUCTW, lpszProgressTitle, 8) + TEST_FIELD_OFFSET(SHFILEOPSTRUCTW, lpszProgressTitle, 48) +} + +static void test_pack_SHNAMEMAPPINGA(void) +{ + /* SHNAMEMAPPINGA */ + TEST_TYPE_SIZE (SHNAMEMAPPINGA, 24) + TEST_TYPE_ALIGN (SHNAMEMAPPINGA, 8) + TEST_FIELD_SIZE (SHNAMEMAPPINGA, pszOldPath, 8) + TEST_FIELD_ALIGN (SHNAMEMAPPINGA, pszOldPath, 8) + TEST_FIELD_OFFSET(SHNAMEMAPPINGA, pszOldPath, 0) + TEST_FIELD_SIZE (SHNAMEMAPPINGA, pszNewPath, 8) + TEST_FIELD_ALIGN (SHNAMEMAPPINGA, pszNewPath, 8) + TEST_FIELD_OFFSET(SHNAMEMAPPINGA, pszNewPath, 8) + TEST_FIELD_SIZE (SHNAMEMAPPINGA, cchOldPath, 4) + TEST_FIELD_ALIGN (SHNAMEMAPPINGA, cchOldPath, 4) + TEST_FIELD_OFFSET(SHNAMEMAPPINGA, cchOldPath, 16) + TEST_FIELD_SIZE (SHNAMEMAPPINGA, cchNewPath, 4) + TEST_FIELD_ALIGN (SHNAMEMAPPINGA, cchNewPath, 4) + TEST_FIELD_OFFSET(SHNAMEMAPPINGA, cchNewPath, 20) +} + +static void test_pack_SHNAMEMAPPINGW(void) +{ + /* SHNAMEMAPPINGW */ + TEST_TYPE_SIZE (SHNAMEMAPPINGW, 24) + TEST_TYPE_ALIGN (SHNAMEMAPPINGW, 8) + TEST_FIELD_SIZE (SHNAMEMAPPINGW, pszOldPath, 8) + TEST_FIELD_ALIGN (SHNAMEMAPPINGW, pszOldPath, 8) + TEST_FIELD_OFFSET(SHNAMEMAPPINGW, pszOldPath, 0) + TEST_FIELD_SIZE (SHNAMEMAPPINGW, pszNewPath, 8) + TEST_FIELD_ALIGN (SHNAMEMAPPINGW, pszNewPath, 8) + TEST_FIELD_OFFSET(SHNAMEMAPPINGW, pszNewPath, 8) + TEST_FIELD_SIZE (SHNAMEMAPPINGW, cchOldPath, 4) + TEST_FIELD_ALIGN (SHNAMEMAPPINGW, cchOldPath, 4) + TEST_FIELD_OFFSET(SHNAMEMAPPINGW, cchOldPath, 16) + TEST_FIELD_SIZE (SHNAMEMAPPINGW, cchNewPath, 4) + TEST_FIELD_ALIGN (SHNAMEMAPPINGW, cchNewPath, 4) + TEST_FIELD_OFFSET(SHNAMEMAPPINGW, cchNewPath, 20) +} + +static void test_pack_ITEMIDLIST(void) +{ + /* ITEMIDLIST (pack 1) */ + TEST_TYPE_SIZE (ITEMIDLIST, 3) + TEST_TYPE_ALIGN (ITEMIDLIST, 1) + TEST_FIELD_SIZE (ITEMIDLIST, mkid, 3) + TEST_FIELD_ALIGN (ITEMIDLIST, mkid, 1) + TEST_FIELD_OFFSET(ITEMIDLIST, mkid, 0) +} + +static void test_pack_LPCITEMIDLIST(void) +{ + /* LPCITEMIDLIST */ + TEST_TYPE_SIZE (LPCITEMIDLIST, 8) + TEST_TYPE_ALIGN (LPCITEMIDLIST, 8) + TEST_TARGET_SIZE (LPCITEMIDLIST, 3) + TEST_TARGET_ALIGN(LPCITEMIDLIST, 1) +} + +static void test_pack_LPCSHITEMID(void) +{ + /* LPCSHITEMID */ + TEST_TYPE_SIZE (LPCSHITEMID, 8) + TEST_TYPE_ALIGN (LPCSHITEMID, 8) + TEST_TARGET_SIZE (LPCSHITEMID, 3) + TEST_TARGET_ALIGN(LPCSHITEMID, 1) +} + +static void test_pack_LPITEMIDLIST(void) +{ + /* LPITEMIDLIST */ + TEST_TYPE_SIZE (LPITEMIDLIST, 8) + TEST_TYPE_ALIGN (LPITEMIDLIST, 8) +} + +static void test_pack_LPSHELLDETAILS(void) +{ + /* LPSHELLDETAILS */ + TEST_TYPE_SIZE (LPSHELLDETAILS, 8) + TEST_TYPE_ALIGN (LPSHELLDETAILS, 8) +} + +static void test_pack_LPSHITEMID(void) +{ + /* LPSHITEMID */ + TEST_TYPE_SIZE (LPSHITEMID, 8) + TEST_TYPE_ALIGN (LPSHITEMID, 8) +} + +static void test_pack_LPSTRRET(void) +{ + /* LPSTRRET */ + TEST_TYPE_SIZE (LPSTRRET, 8) + TEST_TYPE_ALIGN (LPSTRRET, 8) +} + +static void test_pack_SHELLDETAILS(void) +{ + /* SHELLDETAILS (pack 1) */ + TEST_FIELD_SIZE (SHELLDETAILS, fmt, 4) + TEST_FIELD_ALIGN (SHELLDETAILS, fmt, 1) + TEST_FIELD_OFFSET(SHELLDETAILS, fmt, 0) + TEST_FIELD_SIZE (SHELLDETAILS, cxChar, 4) + TEST_FIELD_ALIGN (SHELLDETAILS, cxChar, 1) + TEST_FIELD_OFFSET(SHELLDETAILS, cxChar, 4) +} + +static void test_pack_SHITEMID(void) +{ + /* SHITEMID (pack 1) */ + TEST_TYPE_SIZE (SHITEMID, 3) + TEST_TYPE_ALIGN (SHITEMID, 1) + TEST_FIELD_SIZE (SHITEMID, cb, 2) + TEST_FIELD_ALIGN (SHITEMID, cb, 1) + TEST_FIELD_OFFSET(SHITEMID, cb, 0) + TEST_FIELD_SIZE (SHITEMID, abID, 1) + TEST_FIELD_ALIGN (SHITEMID, abID, 1) + TEST_FIELD_OFFSET(SHITEMID, abID, 2) +} + +static void test_pack_STRRET(void) +{ + /* STRRET (pack 8) */ + TEST_FIELD_SIZE (STRRET, uType, 4) + TEST_FIELD_ALIGN (STRRET, uType, 4) + TEST_FIELD_OFFSET(STRRET, uType, 0) +} + +static void test_pack_AUTO_SCROLL_DATA(void) +{ + /* AUTO_SCROLL_DATA (pack 1) */ + TEST_TYPE_SIZE (AUTO_SCROLL_DATA, 48) + TEST_TYPE_ALIGN (AUTO_SCROLL_DATA, 1) + TEST_FIELD_SIZE (AUTO_SCROLL_DATA, iNextSample, 4) + TEST_FIELD_ALIGN (AUTO_SCROLL_DATA, iNextSample, 1) + TEST_FIELD_OFFSET(AUTO_SCROLL_DATA, iNextSample, 0) + TEST_FIELD_SIZE (AUTO_SCROLL_DATA, dwLastScroll, 4) + TEST_FIELD_ALIGN (AUTO_SCROLL_DATA, dwLastScroll, 1) + TEST_FIELD_OFFSET(AUTO_SCROLL_DATA, dwLastScroll, 4) + TEST_FIELD_SIZE (AUTO_SCROLL_DATA, bFull, 4) + TEST_FIELD_ALIGN (AUTO_SCROLL_DATA, bFull, 1) + TEST_FIELD_OFFSET(AUTO_SCROLL_DATA, bFull, 8) + TEST_FIELD_SIZE (AUTO_SCROLL_DATA, pts, 24) + TEST_FIELD_ALIGN (AUTO_SCROLL_DATA, pts, 1) + TEST_FIELD_OFFSET(AUTO_SCROLL_DATA, pts, 12) + TEST_FIELD_SIZE (AUTO_SCROLL_DATA, dwTimes, 12) + TEST_FIELD_ALIGN (AUTO_SCROLL_DATA, dwTimes, 1) + TEST_FIELD_OFFSET(AUTO_SCROLL_DATA, dwTimes, 36) +} + +static void test_pack_BFFCALLBACK(void) +{ + /* BFFCALLBACK */ + TEST_TYPE_SIZE (BFFCALLBACK, 8) + TEST_TYPE_ALIGN (BFFCALLBACK, 8) +} + +static void test_pack_BROWSEINFOA(void) +{ + /* BROWSEINFOA (pack 8) */ + TEST_TYPE_SIZE (BROWSEINFOA, 64) + TEST_TYPE_ALIGN (BROWSEINFOA, 8) + TEST_FIELD_SIZE (BROWSEINFOA, hwndOwner, 8) + TEST_FIELD_ALIGN (BROWSEINFOA, hwndOwner, 8) + TEST_FIELD_OFFSET(BROWSEINFOA, hwndOwner, 0) + TEST_FIELD_SIZE (BROWSEINFOA, pidlRoot, 8) + TEST_FIELD_ALIGN (BROWSEINFOA, pidlRoot, 8) + TEST_FIELD_OFFSET(BROWSEINFOA, pidlRoot, 8) + TEST_FIELD_SIZE (BROWSEINFOA, pszDisplayName, 8) + TEST_FIELD_ALIGN (BROWSEINFOA, pszDisplayName, 8) + TEST_FIELD_OFFSET(BROWSEINFOA, pszDisplayName, 16) + TEST_FIELD_SIZE (BROWSEINFOA, lpszTitle, 8) + TEST_FIELD_ALIGN (BROWSEINFOA, lpszTitle, 8) + TEST_FIELD_OFFSET(BROWSEINFOA, lpszTitle, 24) + TEST_FIELD_SIZE (BROWSEINFOA, ulFlags, 4) + TEST_FIELD_ALIGN (BROWSEINFOA, ulFlags, 4) + TEST_FIELD_OFFSET(BROWSEINFOA, ulFlags, 32) + TEST_FIELD_SIZE (BROWSEINFOA, lpfn, 8) + TEST_FIELD_ALIGN (BROWSEINFOA, lpfn, 8) + TEST_FIELD_OFFSET(BROWSEINFOA, lpfn, 40) + TEST_FIELD_SIZE (BROWSEINFOA, lParam, 8) + TEST_FIELD_ALIGN (BROWSEINFOA, lParam, 8) + TEST_FIELD_OFFSET(BROWSEINFOA, lParam, 48) + TEST_FIELD_SIZE (BROWSEINFOA, iImage, 4) + TEST_FIELD_ALIGN (BROWSEINFOA, iImage, 4) + TEST_FIELD_OFFSET(BROWSEINFOA, iImage, 56) +} + +static void test_pack_BROWSEINFOW(void) +{ + /* BROWSEINFOW (pack 8) */ + TEST_TYPE_SIZE (BROWSEINFOW, 64) + TEST_TYPE_ALIGN (BROWSEINFOW, 8) + TEST_FIELD_SIZE (BROWSEINFOW, hwndOwner, 8) + TEST_FIELD_ALIGN (BROWSEINFOW, hwndOwner, 8) + TEST_FIELD_OFFSET(BROWSEINFOW, hwndOwner, 0) + TEST_FIELD_SIZE (BROWSEINFOW, pidlRoot, 8) + TEST_FIELD_ALIGN (BROWSEINFOW, pidlRoot, 8) + TEST_FIELD_OFFSET(BROWSEINFOW, pidlRoot, 8) + TEST_FIELD_SIZE (BROWSEINFOW, pszDisplayName, 8) + TEST_FIELD_ALIGN (BROWSEINFOW, pszDisplayName, 8) + TEST_FIELD_OFFSET(BROWSEINFOW, pszDisplayName, 16) + TEST_FIELD_SIZE (BROWSEINFOW, lpszTitle, 8) + TEST_FIELD_ALIGN (BROWSEINFOW, lpszTitle, 8) + TEST_FIELD_OFFSET(BROWSEINFOW, lpszTitle, 24) + TEST_FIELD_SIZE (BROWSEINFOW, ulFlags, 4) + TEST_FIELD_ALIGN (BROWSEINFOW, ulFlags, 4) + TEST_FIELD_OFFSET(BROWSEINFOW, ulFlags, 32) + TEST_FIELD_SIZE (BROWSEINFOW, lpfn, 8) + TEST_FIELD_ALIGN (BROWSEINFOW, lpfn, 8) + TEST_FIELD_OFFSET(BROWSEINFOW, lpfn, 40) + TEST_FIELD_SIZE (BROWSEINFOW, lParam, 8) + TEST_FIELD_ALIGN (BROWSEINFOW, lParam, 8) + TEST_FIELD_OFFSET(BROWSEINFOW, lParam, 48) + TEST_FIELD_SIZE (BROWSEINFOW, iImage, 4) + TEST_FIELD_ALIGN (BROWSEINFOW, iImage, 4) + TEST_FIELD_OFFSET(BROWSEINFOW, iImage, 56) +} + +static void test_pack_CABINETSTATE(void) +{ + /* CABINETSTATE (pack 1) */ + TEST_TYPE_SIZE (CABINETSTATE, 12) + TEST_TYPE_ALIGN (CABINETSTATE, 1) + TEST_FIELD_SIZE (CABINETSTATE, cLength, 2) + TEST_FIELD_ALIGN (CABINETSTATE, cLength, 1) + TEST_FIELD_OFFSET(CABINETSTATE, cLength, 0) + TEST_FIELD_SIZE (CABINETSTATE, nVersion, 2) + TEST_FIELD_ALIGN (CABINETSTATE, nVersion, 1) + TEST_FIELD_OFFSET(CABINETSTATE, nVersion, 2) + TEST_FIELD_SIZE (CABINETSTATE, fMenuEnumFilter, 4) + TEST_FIELD_ALIGN (CABINETSTATE, fMenuEnumFilter, 1) + TEST_FIELD_OFFSET(CABINETSTATE, fMenuEnumFilter, 8) +} + +static void test_pack_CIDA(void) +{ + /* CIDA (pack 1) */ + TEST_TYPE_SIZE (CIDA, 8) + TEST_TYPE_ALIGN (CIDA, 1) + TEST_FIELD_SIZE (CIDA, cidl, 4) + TEST_FIELD_ALIGN (CIDA, cidl, 1) + TEST_FIELD_OFFSET(CIDA, cidl, 0) + TEST_FIELD_SIZE (CIDA, aoffset, 4) + TEST_FIELD_ALIGN (CIDA, aoffset, 1) + TEST_FIELD_OFFSET(CIDA, aoffset, 4) +} + +static void test_pack_CSFV(void) +{ + /* CSFV (pack 8) */ + TEST_FIELD_SIZE (CSFV, cbSize, 4) + TEST_FIELD_ALIGN (CSFV, cbSize, 4) + TEST_FIELD_OFFSET(CSFV, cbSize, 0) + TEST_FIELD_SIZE (CSFV, pshf, 8) + TEST_FIELD_ALIGN (CSFV, pshf, 8) + TEST_FIELD_OFFSET(CSFV, pshf, 8) + TEST_FIELD_SIZE (CSFV, psvOuter, 8) + TEST_FIELD_ALIGN (CSFV, psvOuter, 8) + TEST_FIELD_OFFSET(CSFV, psvOuter, 16) + TEST_FIELD_SIZE (CSFV, pidl, 8) + TEST_FIELD_ALIGN (CSFV, pidl, 8) + TEST_FIELD_OFFSET(CSFV, pidl, 24) + TEST_FIELD_SIZE (CSFV, lEvents, 4) + TEST_FIELD_ALIGN (CSFV, lEvents, 4) + TEST_FIELD_OFFSET(CSFV, lEvents, 32) + TEST_FIELD_SIZE (CSFV, pfnCallback, 8) + TEST_FIELD_ALIGN (CSFV, pfnCallback, 8) + TEST_FIELD_OFFSET(CSFV, pfnCallback, 40) +} + +static void test_pack_DROPFILES(void) +{ + /* DROPFILES (pack 1) */ + TEST_TYPE_SIZE (DROPFILES, 20) + TEST_TYPE_ALIGN (DROPFILES, 1) + TEST_FIELD_SIZE (DROPFILES, pFiles, 4) + TEST_FIELD_ALIGN (DROPFILES, pFiles, 1) + TEST_FIELD_OFFSET(DROPFILES, pFiles, 0) + TEST_FIELD_SIZE (DROPFILES, pt, 8) + TEST_FIELD_ALIGN (DROPFILES, pt, 1) + TEST_FIELD_OFFSET(DROPFILES, pt, 4) + TEST_FIELD_SIZE (DROPFILES, fNC, 4) + TEST_FIELD_ALIGN (DROPFILES, fNC, 1) + TEST_FIELD_OFFSET(DROPFILES, fNC, 12) + TEST_FIELD_SIZE (DROPFILES, fWide, 4) + TEST_FIELD_ALIGN (DROPFILES, fWide, 1) + TEST_FIELD_OFFSET(DROPFILES, fWide, 16) +} + +static void test_pack_FILEDESCRIPTORA(void) +{ + /* FILEDESCRIPTORA (pack 1) */ + TEST_TYPE_SIZE (FILEDESCRIPTORA, 332) + TEST_TYPE_ALIGN (FILEDESCRIPTORA, 1) + TEST_FIELD_SIZE (FILEDESCRIPTORA, dwFlags, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, dwFlags, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, dwFlags, 0) + TEST_FIELD_SIZE (FILEDESCRIPTORA, clsid, 16) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, clsid, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, clsid, 4) + TEST_FIELD_SIZE (FILEDESCRIPTORA, sizel, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, sizel, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, sizel, 20) + TEST_FIELD_SIZE (FILEDESCRIPTORA, pointl, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, pointl, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, pointl, 28) + TEST_FIELD_SIZE (FILEDESCRIPTORA, dwFileAttributes, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, dwFileAttributes, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, dwFileAttributes, 36) + TEST_FIELD_SIZE (FILEDESCRIPTORA, ftCreationTime, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, ftCreationTime, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, ftCreationTime, 40) + TEST_FIELD_SIZE (FILEDESCRIPTORA, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, ftLastAccessTime, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, ftLastAccessTime, 48) + TEST_FIELD_SIZE (FILEDESCRIPTORA, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, ftLastWriteTime, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, ftLastWriteTime, 56) + TEST_FIELD_SIZE (FILEDESCRIPTORA, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, nFileSizeHigh, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, nFileSizeHigh, 64) + TEST_FIELD_SIZE (FILEDESCRIPTORA, nFileSizeLow, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, nFileSizeLow, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, nFileSizeLow, 68) + TEST_FIELD_SIZE (FILEDESCRIPTORA, cFileName, 260) + TEST_FIELD_ALIGN (FILEDESCRIPTORA, cFileName, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORA, cFileName, 72) +} + +static void test_pack_FILEDESCRIPTORW(void) +{ + /* FILEDESCRIPTORW (pack 1) */ + TEST_TYPE_SIZE (FILEDESCRIPTORW, 592) + TEST_TYPE_ALIGN (FILEDESCRIPTORW, 1) + TEST_FIELD_SIZE (FILEDESCRIPTORW, dwFlags, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, dwFlags, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, dwFlags, 0) + TEST_FIELD_SIZE (FILEDESCRIPTORW, clsid, 16) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, clsid, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, clsid, 4) + TEST_FIELD_SIZE (FILEDESCRIPTORW, sizel, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, sizel, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, sizel, 20) + TEST_FIELD_SIZE (FILEDESCRIPTORW, pointl, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, pointl, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, pointl, 28) + TEST_FIELD_SIZE (FILEDESCRIPTORW, dwFileAttributes, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, dwFileAttributes, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, dwFileAttributes, 36) + TEST_FIELD_SIZE (FILEDESCRIPTORW, ftCreationTime, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, ftCreationTime, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, ftCreationTime, 40) + TEST_FIELD_SIZE (FILEDESCRIPTORW, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, ftLastAccessTime, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, ftLastAccessTime, 48) + TEST_FIELD_SIZE (FILEDESCRIPTORW, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, ftLastWriteTime, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, ftLastWriteTime, 56) + TEST_FIELD_SIZE (FILEDESCRIPTORW, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, nFileSizeHigh, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, nFileSizeHigh, 64) + TEST_FIELD_SIZE (FILEDESCRIPTORW, nFileSizeLow, 4) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, nFileSizeLow, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, nFileSizeLow, 68) + TEST_FIELD_SIZE (FILEDESCRIPTORW, cFileName, 520) + TEST_FIELD_ALIGN (FILEDESCRIPTORW, cFileName, 1) + TEST_FIELD_OFFSET(FILEDESCRIPTORW, cFileName, 72) +} + +static void test_pack_FILEGROUPDESCRIPTORA(void) +{ + /* FILEGROUPDESCRIPTORA (pack 1) */ + TEST_TYPE_SIZE (FILEGROUPDESCRIPTORA, 336) + TEST_TYPE_ALIGN (FILEGROUPDESCRIPTORA, 1) + TEST_FIELD_SIZE (FILEGROUPDESCRIPTORA, cItems, 4) + TEST_FIELD_ALIGN (FILEGROUPDESCRIPTORA, cItems, 1) + TEST_FIELD_OFFSET(FILEGROUPDESCRIPTORA, cItems, 0) + TEST_FIELD_SIZE (FILEGROUPDESCRIPTORA, fgd, 332) + TEST_FIELD_ALIGN (FILEGROUPDESCRIPTORA, fgd, 1) + TEST_FIELD_OFFSET(FILEGROUPDESCRIPTORA, fgd, 4) +} + +static void test_pack_FILEGROUPDESCRIPTORW(void) +{ + /* FILEGROUPDESCRIPTORW (pack 1) */ + TEST_TYPE_SIZE (FILEGROUPDESCRIPTORW, 596) + TEST_TYPE_ALIGN (FILEGROUPDESCRIPTORW, 1) + TEST_FIELD_SIZE (FILEGROUPDESCRIPTORW, cItems, 4) + TEST_FIELD_ALIGN (FILEGROUPDESCRIPTORW, cItems, 1) + TEST_FIELD_OFFSET(FILEGROUPDESCRIPTORW, cItems, 0) + TEST_FIELD_SIZE (FILEGROUPDESCRIPTORW, fgd, 592) + TEST_FIELD_ALIGN (FILEGROUPDESCRIPTORW, fgd, 1) + TEST_FIELD_OFFSET(FILEGROUPDESCRIPTORW, fgd, 4) +} + +static void test_pack_ITEMSPACING(void) +{ + /* ITEMSPACING (pack 8) */ + TEST_TYPE_SIZE (ITEMSPACING, 16) + TEST_TYPE_ALIGN (ITEMSPACING, 4) + TEST_FIELD_SIZE (ITEMSPACING, cxSmall, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cxSmall, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cxSmall, 0) + TEST_FIELD_SIZE (ITEMSPACING, cySmall, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cySmall, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cySmall, 4) + TEST_FIELD_SIZE (ITEMSPACING, cxLarge, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cxLarge, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cxLarge, 8) + TEST_FIELD_SIZE (ITEMSPACING, cyLarge, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cyLarge, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cyLarge, 12) +} + +static void test_pack_LPBROWSEINFOA(void) +{ + /* LPBROWSEINFOA */ + TEST_TYPE_SIZE (LPBROWSEINFOA, 8) + TEST_TYPE_ALIGN (LPBROWSEINFOA, 8) + TEST_TARGET_SIZE (LPBROWSEINFOA, 64) + TEST_TARGET_ALIGN(LPBROWSEINFOA, 8) +} + +static void test_pack_LPBROWSEINFOW(void) +{ + /* LPBROWSEINFOW */ + TEST_TYPE_SIZE (LPBROWSEINFOW, 8) + TEST_TYPE_ALIGN (LPBROWSEINFOW, 8) + TEST_TARGET_SIZE (LPBROWSEINFOW, 64) + TEST_TARGET_ALIGN(LPBROWSEINFOW, 8) +} + +static void test_pack_LPCABINETSTATE(void) +{ + /* LPCABINETSTATE */ + TEST_TYPE_SIZE (LPCABINETSTATE, 8) + TEST_TYPE_ALIGN (LPCABINETSTATE, 8) + TEST_TARGET_SIZE (LPCABINETSTATE, 12) + TEST_TARGET_ALIGN(LPCABINETSTATE, 1) +} + +static void test_pack_LPCSFV(void) +{ + /* LPCSFV */ + TEST_TYPE_SIZE (LPCSFV, 8) + TEST_TYPE_ALIGN (LPCSFV, 8) +} + +static void test_pack_LPDROPFILES(void) +{ + /* LPDROPFILES */ + TEST_TYPE_SIZE (LPDROPFILES, 8) + TEST_TYPE_ALIGN (LPDROPFILES, 8) + TEST_TARGET_SIZE (LPDROPFILES, 20) + TEST_TARGET_ALIGN(LPDROPFILES, 1) +} + +static void test_pack_LPFILEDESCRIPTORA(void) +{ + /* LPFILEDESCRIPTORA */ + TEST_TYPE_SIZE (LPFILEDESCRIPTORA, 8) + TEST_TYPE_ALIGN (LPFILEDESCRIPTORA, 8) + TEST_TARGET_SIZE (LPFILEDESCRIPTORA, 332) + TEST_TARGET_ALIGN(LPFILEDESCRIPTORA, 1) +} + +static void test_pack_LPFILEDESCRIPTORW(void) +{ + /* LPFILEDESCRIPTORW */ + TEST_TYPE_SIZE (LPFILEDESCRIPTORW, 8) + TEST_TYPE_ALIGN (LPFILEDESCRIPTORW, 8) + TEST_TARGET_SIZE (LPFILEDESCRIPTORW, 592) + TEST_TARGET_ALIGN(LPFILEDESCRIPTORW, 1) +} + +static void test_pack_LPFILEGROUPDESCRIPTORA(void) +{ + /* LPFILEGROUPDESCRIPTORA */ + TEST_TYPE_SIZE (LPFILEGROUPDESCRIPTORA, 8) + TEST_TYPE_ALIGN (LPFILEGROUPDESCRIPTORA, 8) + TEST_TARGET_SIZE (LPFILEGROUPDESCRIPTORA, 336) + TEST_TARGET_ALIGN(LPFILEGROUPDESCRIPTORA, 1) +} + +static void test_pack_LPFILEGROUPDESCRIPTORW(void) +{ + /* LPFILEGROUPDESCRIPTORW */ + TEST_TYPE_SIZE (LPFILEGROUPDESCRIPTORW, 8) + TEST_TYPE_ALIGN (LPFILEGROUPDESCRIPTORW, 8) + TEST_TARGET_SIZE (LPFILEGROUPDESCRIPTORW, 596) + TEST_TARGET_ALIGN(LPFILEGROUPDESCRIPTORW, 1) +} + +static void test_pack_LPFNVIEWCALLBACK(void) +{ + /* LPFNVIEWCALLBACK */ + TEST_TYPE_SIZE (LPFNVIEWCALLBACK, 8) + TEST_TYPE_ALIGN (LPFNVIEWCALLBACK, 8) +} + +static void test_pack_LPIDA(void) +{ + /* LPIDA */ + TEST_TYPE_SIZE (LPIDA, 8) + TEST_TYPE_ALIGN (LPIDA, 8) + TEST_TARGET_SIZE (LPIDA, 8) + TEST_TARGET_ALIGN(LPIDA, 1) +} + +static void test_pack_LPQCMINFO(void) +{ + /* LPQCMINFO */ + TEST_TYPE_SIZE (LPQCMINFO, 8) + TEST_TYPE_ALIGN (LPQCMINFO, 8) + TEST_TARGET_SIZE (LPQCMINFO, 32) + TEST_TARGET_ALIGN(LPQCMINFO, 8) +} + +static void test_pack_LPSHChangeDWORDAsIDList(void) +{ + /* LPSHChangeDWORDAsIDList */ + TEST_TYPE_SIZE (LPSHChangeDWORDAsIDList, 8) + TEST_TYPE_ALIGN (LPSHChangeDWORDAsIDList, 8) + TEST_TARGET_SIZE (LPSHChangeDWORDAsIDList, 12) + TEST_TARGET_ALIGN(LPSHChangeDWORDAsIDList, 1) +} + +static void test_pack_LPSHChangeProductKeyAsIDList(void) +{ + /* LPSHChangeProductKeyAsIDList */ + TEST_TYPE_SIZE (LPSHChangeProductKeyAsIDList, 8) + TEST_TYPE_ALIGN (LPSHChangeProductKeyAsIDList, 8) + TEST_TARGET_SIZE (LPSHChangeProductKeyAsIDList, 82) + TEST_TARGET_ALIGN(LPSHChangeProductKeyAsIDList, 1) +} + +static void test_pack_LPSHDESCRIPTIONID(void) +{ + /* LPSHDESCRIPTIONID */ + TEST_TYPE_SIZE (LPSHDESCRIPTIONID, 8) + TEST_TYPE_ALIGN (LPSHDESCRIPTIONID, 8) + TEST_TARGET_SIZE (LPSHDESCRIPTIONID, 20) + TEST_TARGET_ALIGN(LPSHDESCRIPTIONID, 4) +} + +static void test_pack_LPSHELLFLAGSTATE(void) +{ + /* LPSHELLFLAGSTATE */ + TEST_TYPE_SIZE (LPSHELLFLAGSTATE, 8) + TEST_TYPE_ALIGN (LPSHELLFLAGSTATE, 8) + TEST_TARGET_SIZE (LPSHELLFLAGSTATE, 4) + TEST_TARGET_ALIGN(LPSHELLFLAGSTATE, 1) +} + +static void test_pack_LPSHELLSTATE(void) +{ + /* LPSHELLSTATE */ + TEST_TYPE_SIZE (LPSHELLSTATE, 8) + TEST_TYPE_ALIGN (LPSHELLSTATE, 8) + TEST_TARGET_SIZE (LPSHELLSTATE, 32) + TEST_TARGET_ALIGN(LPSHELLSTATE, 1) +} + +static void test_pack_LPTBINFO(void) +{ + /* LPTBINFO */ + TEST_TYPE_SIZE (LPTBINFO, 8) + TEST_TYPE_ALIGN (LPTBINFO, 8) + TEST_TARGET_SIZE (LPTBINFO, 8) + TEST_TARGET_ALIGN(LPTBINFO, 4) +} + +static void test_pack_PBROWSEINFOA(void) +{ + /* PBROWSEINFOA */ + TEST_TYPE_SIZE (PBROWSEINFOA, 8) + TEST_TYPE_ALIGN (PBROWSEINFOA, 8) + TEST_TARGET_SIZE (PBROWSEINFOA, 64) + TEST_TARGET_ALIGN(PBROWSEINFOA, 8) +} + +static void test_pack_PBROWSEINFOW(void) +{ + /* PBROWSEINFOW */ + TEST_TYPE_SIZE (PBROWSEINFOW, 8) + TEST_TYPE_ALIGN (PBROWSEINFOW, 8) + TEST_TARGET_SIZE (PBROWSEINFOW, 64) + TEST_TARGET_ALIGN(PBROWSEINFOW, 8) +} + +static void test_pack_QCMINFO(void) +{ + /* QCMINFO (pack 8) */ + TEST_TYPE_SIZE (QCMINFO, 32) + TEST_TYPE_ALIGN (QCMINFO, 8) + TEST_FIELD_SIZE (QCMINFO, hmenu, 8) + TEST_FIELD_ALIGN (QCMINFO, hmenu, 8) + TEST_FIELD_OFFSET(QCMINFO, hmenu, 0) + TEST_FIELD_SIZE (QCMINFO, indexMenu, 4) + TEST_FIELD_ALIGN (QCMINFO, indexMenu, 4) + TEST_FIELD_OFFSET(QCMINFO, indexMenu, 8) + TEST_FIELD_SIZE (QCMINFO, idCmdFirst, 4) + TEST_FIELD_ALIGN (QCMINFO, idCmdFirst, 4) + TEST_FIELD_OFFSET(QCMINFO, idCmdFirst, 12) + TEST_FIELD_SIZE (QCMINFO, idCmdLast, 4) + TEST_FIELD_ALIGN (QCMINFO, idCmdLast, 4) + TEST_FIELD_OFFSET(QCMINFO, idCmdLast, 16) + TEST_FIELD_SIZE (QCMINFO, pIdMap, 8) + TEST_FIELD_ALIGN (QCMINFO, pIdMap, 8) + TEST_FIELD_OFFSET(QCMINFO, pIdMap, 24) +} + +static void test_pack_QCMINFO_IDMAP(void) +{ + /* QCMINFO_IDMAP (pack 8) */ + TEST_TYPE_SIZE (QCMINFO_IDMAP, 12) + TEST_TYPE_ALIGN (QCMINFO_IDMAP, 4) + TEST_FIELD_SIZE (QCMINFO_IDMAP, nMaxIds, 4) + TEST_FIELD_ALIGN (QCMINFO_IDMAP, nMaxIds, 4) + TEST_FIELD_OFFSET(QCMINFO_IDMAP, nMaxIds, 0) + TEST_FIELD_SIZE (QCMINFO_IDMAP, pIdList, 8) + TEST_FIELD_ALIGN (QCMINFO_IDMAP, pIdList, 4) + TEST_FIELD_OFFSET(QCMINFO_IDMAP, pIdList, 4) +} + +static void test_pack_QCMINFO_IDMAP_PLACEMENT(void) +{ + /* QCMINFO_IDMAP_PLACEMENT (pack 8) */ + TEST_TYPE_SIZE (QCMINFO_IDMAP_PLACEMENT, 8) + TEST_TYPE_ALIGN (QCMINFO_IDMAP_PLACEMENT, 4) + TEST_FIELD_SIZE (QCMINFO_IDMAP_PLACEMENT, id, 4) + TEST_FIELD_ALIGN (QCMINFO_IDMAP_PLACEMENT, id, 4) + TEST_FIELD_OFFSET(QCMINFO_IDMAP_PLACEMENT, id, 0) + TEST_FIELD_SIZE (QCMINFO_IDMAP_PLACEMENT, fFlags, 4) + TEST_FIELD_ALIGN (QCMINFO_IDMAP_PLACEMENT, fFlags, 4) + TEST_FIELD_OFFSET(QCMINFO_IDMAP_PLACEMENT, fFlags, 4) +} + +static void test_pack_SFV_CREATE(void) +{ + /* SFV_CREATE (pack 8) */ + TEST_TYPE_SIZE (SFV_CREATE, 32) + TEST_TYPE_ALIGN (SFV_CREATE, 8) + TEST_FIELD_SIZE (SFV_CREATE, cbSize, 4) + TEST_FIELD_ALIGN (SFV_CREATE, cbSize, 4) + TEST_FIELD_OFFSET(SFV_CREATE, cbSize, 0) + TEST_FIELD_SIZE (SFV_CREATE, pshf, 8) + TEST_FIELD_ALIGN (SFV_CREATE, pshf, 8) + TEST_FIELD_OFFSET(SFV_CREATE, pshf, 8) + TEST_FIELD_SIZE (SFV_CREATE, psvOuter, 8) + TEST_FIELD_ALIGN (SFV_CREATE, psvOuter, 8) + TEST_FIELD_OFFSET(SFV_CREATE, psvOuter, 16) + TEST_FIELD_SIZE (SFV_CREATE, psfvcb, 8) + TEST_FIELD_ALIGN (SFV_CREATE, psfvcb, 8) + TEST_FIELD_OFFSET(SFV_CREATE, psfvcb, 24) +} + +static void test_pack_SHChangeDWORDAsIDList(void) +{ + /* SHChangeDWORDAsIDList (pack 1) */ + TEST_TYPE_SIZE (SHChangeDWORDAsIDList, 12) + TEST_TYPE_ALIGN (SHChangeDWORDAsIDList, 1) + TEST_FIELD_SIZE (SHChangeDWORDAsIDList, cb, 2) + TEST_FIELD_ALIGN (SHChangeDWORDAsIDList, cb, 1) + TEST_FIELD_OFFSET(SHChangeDWORDAsIDList, cb, 0) + TEST_FIELD_SIZE (SHChangeDWORDAsIDList, dwItem1, 4) + TEST_FIELD_ALIGN (SHChangeDWORDAsIDList, dwItem1, 1) + TEST_FIELD_OFFSET(SHChangeDWORDAsIDList, dwItem1, 2) + TEST_FIELD_SIZE (SHChangeDWORDAsIDList, dwItem2, 4) + TEST_FIELD_ALIGN (SHChangeDWORDAsIDList, dwItem2, 1) + TEST_FIELD_OFFSET(SHChangeDWORDAsIDList, dwItem2, 6) + TEST_FIELD_SIZE (SHChangeDWORDAsIDList, cbZero, 2) + TEST_FIELD_ALIGN (SHChangeDWORDAsIDList, cbZero, 1) + TEST_FIELD_OFFSET(SHChangeDWORDAsIDList, cbZero, 10) +} + +static void test_pack_SHChangeNotifyEntry(void) +{ + /* SHChangeNotifyEntry (pack 1) */ + TEST_TYPE_SIZE (SHChangeNotifyEntry, 12) + TEST_TYPE_ALIGN (SHChangeNotifyEntry, 1) + TEST_FIELD_SIZE (SHChangeNotifyEntry, pidl, 8) + TEST_FIELD_ALIGN (SHChangeNotifyEntry, pidl, 1) + TEST_FIELD_OFFSET(SHChangeNotifyEntry, pidl, 0) + TEST_FIELD_SIZE (SHChangeNotifyEntry, fRecursive, 4) + TEST_FIELD_ALIGN (SHChangeNotifyEntry, fRecursive, 1) + TEST_FIELD_OFFSET(SHChangeNotifyEntry, fRecursive, 8) +} + +static void test_pack_SHChangeProductKeyAsIDList(void) +{ + /* SHChangeProductKeyAsIDList (pack 1) */ + TEST_TYPE_SIZE (SHChangeProductKeyAsIDList, 82) + TEST_TYPE_ALIGN (SHChangeProductKeyAsIDList, 1) + TEST_FIELD_SIZE (SHChangeProductKeyAsIDList, cb, 2) + TEST_FIELD_ALIGN (SHChangeProductKeyAsIDList, cb, 1) + TEST_FIELD_OFFSET(SHChangeProductKeyAsIDList, cb, 0) + TEST_FIELD_SIZE (SHChangeProductKeyAsIDList, wszProductKey, 78) + TEST_FIELD_ALIGN (SHChangeProductKeyAsIDList, wszProductKey, 1) + TEST_FIELD_OFFSET(SHChangeProductKeyAsIDList, wszProductKey, 2) + TEST_FIELD_SIZE (SHChangeProductKeyAsIDList, cbZero, 2) + TEST_FIELD_ALIGN (SHChangeProductKeyAsIDList, cbZero, 1) + TEST_FIELD_OFFSET(SHChangeProductKeyAsIDList, cbZero, 80) +} + +static void test_pack_SHDESCRIPTIONID(void) +{ + /* SHDESCRIPTIONID (pack 8) */ + TEST_TYPE_SIZE (SHDESCRIPTIONID, 20) + TEST_TYPE_ALIGN (SHDESCRIPTIONID, 4) + TEST_FIELD_SIZE (SHDESCRIPTIONID, dwDescriptionId, 4) + TEST_FIELD_ALIGN (SHDESCRIPTIONID, dwDescriptionId, 4) + TEST_FIELD_OFFSET(SHDESCRIPTIONID, dwDescriptionId, 0) + TEST_FIELD_SIZE (SHDESCRIPTIONID, clsid, 16) + TEST_FIELD_ALIGN (SHDESCRIPTIONID, clsid, 4) + TEST_FIELD_OFFSET(SHDESCRIPTIONID, clsid, 4) +} + +static void test_pack_SHELLFLAGSTATE(void) +{ + /* SHELLFLAGSTATE (pack 1) */ + TEST_TYPE_SIZE (SHELLFLAGSTATE, 4) + TEST_TYPE_ALIGN (SHELLFLAGSTATE, 1) +} + +static void test_pack_SHELLSTATE(void) +{ + /* SHELLSTATE (pack 1) */ + TEST_TYPE_SIZE (SHELLSTATE, 32) + TEST_TYPE_ALIGN (SHELLSTATE, 1) + TEST_FIELD_SIZE (SHELLSTATE, dwWin95Unused, 4) + TEST_FIELD_ALIGN (SHELLSTATE, dwWin95Unused, 1) + TEST_FIELD_OFFSET(SHELLSTATE, dwWin95Unused, 4) + TEST_FIELD_SIZE (SHELLSTATE, uWin95Unused, 4) + TEST_FIELD_ALIGN (SHELLSTATE, uWin95Unused, 1) + TEST_FIELD_OFFSET(SHELLSTATE, uWin95Unused, 8) + TEST_FIELD_SIZE (SHELLSTATE, lParamSort, 4) + TEST_FIELD_ALIGN (SHELLSTATE, lParamSort, 1) + TEST_FIELD_OFFSET(SHELLSTATE, lParamSort, 12) + TEST_FIELD_SIZE (SHELLSTATE, iSortDirection, 4) + TEST_FIELD_ALIGN (SHELLSTATE, iSortDirection, 1) + TEST_FIELD_OFFSET(SHELLSTATE, iSortDirection, 16) + TEST_FIELD_SIZE (SHELLSTATE, version, 4) + TEST_FIELD_ALIGN (SHELLSTATE, version, 1) + TEST_FIELD_OFFSET(SHELLSTATE, version, 20) + TEST_FIELD_SIZE (SHELLSTATE, uNotUsed, 4) + TEST_FIELD_ALIGN (SHELLSTATE, uNotUsed, 1) + TEST_FIELD_OFFSET(SHELLSTATE, uNotUsed, 24) +} + +static void test_pack_TBINFO(void) +{ + /* TBINFO (pack 8) */ + TEST_TYPE_SIZE (TBINFO, 8) + TEST_TYPE_ALIGN (TBINFO, 4) + TEST_FIELD_SIZE (TBINFO, cbuttons, 4) + TEST_FIELD_ALIGN (TBINFO, cbuttons, 4) + TEST_FIELD_OFFSET(TBINFO, cbuttons, 0) + TEST_FIELD_SIZE (TBINFO, uFlags, 4) + TEST_FIELD_ALIGN (TBINFO, uFlags, 4) + TEST_FIELD_OFFSET(TBINFO, uFlags, 4) +} + +#else /* _WIN64 */ + +static void test_pack_BLOB(void) +{ + /* BLOB */ TEST_TYPE_SIZE (BLOB, 8) TEST_TYPE_ALIGN (BLOB, 4) TEST_FIELD_SIZE (BLOB, cbSize, 4) @@ -118,7 +1926,7 @@ static void test_pack_BSTR(void) static void test_pack_BSTRBLOB(void) { - /* BSTRBLOB (pack 4) */ + /* BSTRBLOB */ TEST_TYPE_SIZE (BSTRBLOB, 8) TEST_TYPE_ALIGN (BSTRBLOB, 4) TEST_FIELD_SIZE (BSTRBLOB, cbSize, 4) @@ -131,7 +1939,7 @@ static void test_pack_BSTRBLOB(void) static void test_pack_BYTE_BLOB(void) { - /* BYTE_BLOB (pack 4) */ + /* BYTE_BLOB */ TEST_TYPE_SIZE (BYTE_BLOB, 8) TEST_TYPE_ALIGN (BYTE_BLOB, 4) TEST_FIELD_SIZE (BYTE_BLOB, clSize, 4) @@ -144,7 +1952,7 @@ static void test_pack_BYTE_BLOB(void) static void test_pack_BYTE_SIZEDARR(void) { - /* BYTE_SIZEDARR (pack 4) */ + /* BYTE_SIZEDARR */ TEST_TYPE_SIZE (BYTE_SIZEDARR, 8) TEST_TYPE_ALIGN (BYTE_SIZEDARR, 4) TEST_FIELD_SIZE (BYTE_SIZEDARR, clSize, 4) @@ -157,7 +1965,7 @@ static void test_pack_BYTE_SIZEDARR(void) static void test_pack_CLIPDATA(void) { - /* CLIPDATA (pack 4) */ + /* CLIPDATA */ TEST_TYPE_SIZE (CLIPDATA, 12) TEST_TYPE_ALIGN (CLIPDATA, 4) TEST_FIELD_SIZE (CLIPDATA, cbSize, 4) @@ -181,7 +1989,7 @@ static void test_pack_CLIPFORMAT(void) static void test_pack_COAUTHIDENTITY(void) { - /* COAUTHIDENTITY (pack 4) */ + /* COAUTHIDENTITY */ TEST_TYPE_SIZE (COAUTHIDENTITY, 28) TEST_TYPE_ALIGN (COAUTHIDENTITY, 4) TEST_FIELD_SIZE (COAUTHIDENTITY, User, 4) @@ -209,7 +2017,7 @@ static void test_pack_COAUTHIDENTITY(void) static void test_pack_COAUTHINFO(void) { - /* COAUTHINFO (pack 4) */ + /* COAUTHINFO */ TEST_TYPE_SIZE (COAUTHINFO, 28) TEST_TYPE_ALIGN (COAUTHINFO, 4) TEST_FIELD_SIZE (COAUTHINFO, dwAuthnSvc, 4) @@ -251,7 +2059,7 @@ static void test_pack_DOUBLE(void) static void test_pack_DWORD_SIZEDARR(void) { - /* DWORD_SIZEDARR (pack 4) */ + /* DWORD_SIZEDARR */ TEST_TYPE_SIZE (DWORD_SIZEDARR, 8) TEST_TYPE_ALIGN (DWORD_SIZEDARR, 4) TEST_FIELD_SIZE (DWORD_SIZEDARR, clSize, 4) @@ -264,7 +2072,7 @@ static void test_pack_DWORD_SIZEDARR(void) static void test_pack_FLAGGED_BYTE_BLOB(void) { - /* FLAGGED_BYTE_BLOB (pack 4) */ + /* FLAGGED_BYTE_BLOB */ TEST_TYPE_SIZE (FLAGGED_BYTE_BLOB, 12) TEST_TYPE_ALIGN (FLAGGED_BYTE_BLOB, 4) TEST_FIELD_SIZE (FLAGGED_BYTE_BLOB, fFlags, 4) @@ -280,7 +2088,7 @@ static void test_pack_FLAGGED_BYTE_BLOB(void) static void test_pack_FLAGGED_WORD_BLOB(void) { - /* FLAGGED_WORD_BLOB (pack 4) */ + /* FLAGGED_WORD_BLOB */ TEST_TYPE_SIZE (FLAGGED_WORD_BLOB, 12) TEST_TYPE_ALIGN (FLAGGED_WORD_BLOB, 4) TEST_FIELD_SIZE (FLAGGED_WORD_BLOB, fFlags, 4) @@ -303,7 +2111,7 @@ static void test_pack_HMETAFILEPICT(void) static void test_pack_HYPER_SIZEDARR(void) { - /* HYPER_SIZEDARR (pack 4) */ + /* HYPER_SIZEDARR */ TEST_TYPE_SIZE (HYPER_SIZEDARR, 8) TEST_TYPE_ALIGN (HYPER_SIZEDARR, 4) TEST_FIELD_SIZE (HYPER_SIZEDARR, clSize, 4) @@ -385,7 +2193,7 @@ static void test_pack_PROPID(void) static void test_pack_RemHBITMAP(void) { - /* RemHBITMAP (pack 4) */ + /* RemHBITMAP */ TEST_TYPE_SIZE (RemHBITMAP, 8) TEST_TYPE_ALIGN (RemHBITMAP, 4) TEST_FIELD_SIZE (RemHBITMAP, cbData, 4) @@ -398,7 +2206,7 @@ static void test_pack_RemHBITMAP(void) static void test_pack_RemHENHMETAFILE(void) { - /* RemHENHMETAFILE (pack 4) */ + /* RemHENHMETAFILE */ TEST_TYPE_SIZE (RemHENHMETAFILE, 8) TEST_TYPE_ALIGN (RemHENHMETAFILE, 4) TEST_FIELD_SIZE (RemHENHMETAFILE, cbData, 4) @@ -411,7 +2219,7 @@ static void test_pack_RemHENHMETAFILE(void) static void test_pack_RemHGLOBAL(void) { - /* RemHGLOBAL (pack 4) */ + /* RemHGLOBAL */ TEST_TYPE_SIZE (RemHGLOBAL, 12) TEST_TYPE_ALIGN (RemHGLOBAL, 4) TEST_FIELD_SIZE (RemHGLOBAL, fNullHGlobal, 4) @@ -427,7 +2235,7 @@ static void test_pack_RemHGLOBAL(void) static void test_pack_RemHMETAFILEPICT(void) { - /* RemHMETAFILEPICT (pack 4) */ + /* RemHMETAFILEPICT */ TEST_TYPE_SIZE (RemHMETAFILEPICT, 20) TEST_TYPE_ALIGN (RemHMETAFILEPICT, 4) TEST_FIELD_SIZE (RemHMETAFILEPICT, mm, 4) @@ -449,7 +2257,7 @@ static void test_pack_RemHMETAFILEPICT(void) static void test_pack_RemHPALETTE(void) { - /* RemHPALETTE (pack 4) */ + /* RemHPALETTE */ TEST_TYPE_SIZE (RemHPALETTE, 8) TEST_TYPE_ALIGN (RemHPALETTE, 4) TEST_FIELD_SIZE (RemHPALETTE, cbData, 4) @@ -512,7 +2320,7 @@ static void test_pack_VARTYPE(void) static void test_pack_WORD_SIZEDARR(void) { - /* WORD_SIZEDARR (pack 4) */ + /* WORD_SIZEDARR */ TEST_TYPE_SIZE (WORD_SIZEDARR, 8) TEST_TYPE_ALIGN (WORD_SIZEDARR, 4) TEST_FIELD_SIZE (WORD_SIZEDARR, clSize, 4) @@ -525,7 +2333,7 @@ static void test_pack_WORD_SIZEDARR(void) static void test_pack_remoteMETAFILEPICT(void) { - /* remoteMETAFILEPICT (pack 4) */ + /* remoteMETAFILEPICT */ TEST_TYPE_SIZE (remoteMETAFILEPICT, 16) TEST_TYPE_ALIGN (remoteMETAFILEPICT, 4) TEST_FIELD_SIZE (remoteMETAFILEPICT, mm, 4) @@ -544,7 +2352,7 @@ static void test_pack_remoteMETAFILEPICT(void) static void test_pack_userBITMAP(void) { - /* userBITMAP (pack 4) */ + /* userBITMAP */ TEST_TYPE_SIZE (userBITMAP, 28) TEST_TYPE_ALIGN (userBITMAP, 4) TEST_FIELD_SIZE (userBITMAP, bmType, 4) @@ -575,7 +2383,7 @@ static void test_pack_userBITMAP(void) static void test_pack_userCLIPFORMAT(void) { - /* userCLIPFORMAT (pack 4) */ + /* userCLIPFORMAT */ TEST_FIELD_SIZE (userCLIPFORMAT, fContext, 4) TEST_FIELD_ALIGN (userCLIPFORMAT, fContext, 4) TEST_FIELD_OFFSET(userCLIPFORMAT, fContext, 0) @@ -583,7 +2391,7 @@ static void test_pack_userCLIPFORMAT(void) static void test_pack_userHBITMAP(void) { - /* userHBITMAP (pack 4) */ + /* userHBITMAP */ TEST_FIELD_SIZE (userHBITMAP, fContext, 4) TEST_FIELD_ALIGN (userHBITMAP, fContext, 4) TEST_FIELD_OFFSET(userHBITMAP, fContext, 0) @@ -591,7 +2399,7 @@ static void test_pack_userHBITMAP(void) static void test_pack_userHENHMETAFILE(void) { - /* userHENHMETAFILE (pack 4) */ + /* userHENHMETAFILE */ TEST_FIELD_SIZE (userHENHMETAFILE, fContext, 4) TEST_FIELD_ALIGN (userHENHMETAFILE, fContext, 4) TEST_FIELD_OFFSET(userHENHMETAFILE, fContext, 0) @@ -599,7 +2407,7 @@ static void test_pack_userHENHMETAFILE(void) static void test_pack_userHGLOBAL(void) { - /* userHGLOBAL (pack 4) */ + /* userHGLOBAL */ TEST_FIELD_SIZE (userHGLOBAL, fContext, 4) TEST_FIELD_ALIGN (userHGLOBAL, fContext, 4) TEST_FIELD_OFFSET(userHGLOBAL, fContext, 0) @@ -607,7 +2415,7 @@ static void test_pack_userHGLOBAL(void) static void test_pack_userHMETAFILE(void) { - /* userHMETAFILE (pack 4) */ + /* userHMETAFILE */ TEST_FIELD_SIZE (userHMETAFILE, fContext, 4) TEST_FIELD_ALIGN (userHMETAFILE, fContext, 4) TEST_FIELD_OFFSET(userHMETAFILE, fContext, 0) @@ -615,7 +2423,7 @@ static void test_pack_userHMETAFILE(void) static void test_pack_userHMETAFILEPICT(void) { - /* userHMETAFILEPICT (pack 4) */ + /* userHMETAFILEPICT */ TEST_FIELD_SIZE (userHMETAFILEPICT, fContext, 4) TEST_FIELD_ALIGN (userHMETAFILEPICT, fContext, 4) TEST_FIELD_OFFSET(userHMETAFILEPICT, fContext, 0) @@ -623,7 +2431,7 @@ static void test_pack_userHMETAFILEPICT(void) static void test_pack_userHPALETTE(void) { - /* userHPALETTE (pack 4) */ + /* userHPALETTE */ TEST_FIELD_SIZE (userHPALETTE, fContext, 4) TEST_FIELD_ALIGN (userHPALETTE, fContext, 4) TEST_FIELD_OFFSET(userHPALETTE, fContext, 0) @@ -1268,7 +3076,7 @@ static void test_pack_SHITEMID(void) static void test_pack_STRRET(void) { - /* STRRET (pack 4) */ + /* STRRET (pack 8) */ TEST_FIELD_SIZE (STRRET, uType, 4) TEST_FIELD_ALIGN (STRRET, uType, 4) TEST_FIELD_OFFSET(STRRET, uType, 0) @@ -1396,24 +3204,24 @@ static void test_pack_CIDA(void) static void test_pack_CSFV(void) { - /* CSFV (pack 1) */ + /* CSFV (pack 8) */ TEST_FIELD_SIZE (CSFV, cbSize, 4) - TEST_FIELD_ALIGN (CSFV, cbSize, 1) + TEST_FIELD_ALIGN (CSFV, cbSize, 4) TEST_FIELD_OFFSET(CSFV, cbSize, 0) TEST_FIELD_SIZE (CSFV, pshf, 4) - TEST_FIELD_ALIGN (CSFV, pshf, 1) + TEST_FIELD_ALIGN (CSFV, pshf, 4) TEST_FIELD_OFFSET(CSFV, pshf, 4) TEST_FIELD_SIZE (CSFV, psvOuter, 4) - TEST_FIELD_ALIGN (CSFV, psvOuter, 1) + TEST_FIELD_ALIGN (CSFV, psvOuter, 4) TEST_FIELD_OFFSET(CSFV, psvOuter, 8) TEST_FIELD_SIZE (CSFV, pidl, 4) - TEST_FIELD_ALIGN (CSFV, pidl, 1) + TEST_FIELD_ALIGN (CSFV, pidl, 4) TEST_FIELD_OFFSET(CSFV, pidl, 12) TEST_FIELD_SIZE (CSFV, lEvents, 4) - TEST_FIELD_ALIGN (CSFV, lEvents, 1) + TEST_FIELD_ALIGN (CSFV, lEvents, 4) TEST_FIELD_OFFSET(CSFV, lEvents, 16) TEST_FIELD_SIZE (CSFV, pfnCallback, 4) - TEST_FIELD_ALIGN (CSFV, pfnCallback, 1) + TEST_FIELD_ALIGN (CSFV, pfnCallback, 4) TEST_FIELD_OFFSET(CSFV, pfnCallback, 20) } @@ -1542,6 +3350,25 @@ static void test_pack_FILEGROUPDESCRIPTORW(void) TEST_FIELD_OFFSET(FILEGROUPDESCRIPTORW, fgd, 4) } +static void test_pack_ITEMSPACING(void) +{ + /* ITEMSPACING (pack 8) */ + TEST_TYPE_SIZE (ITEMSPACING, 16) + TEST_TYPE_ALIGN (ITEMSPACING, 4) + TEST_FIELD_SIZE (ITEMSPACING, cxSmall, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cxSmall, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cxSmall, 0) + TEST_FIELD_SIZE (ITEMSPACING, cySmall, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cySmall, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cySmall, 4) + TEST_FIELD_SIZE (ITEMSPACING, cxLarge, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cxLarge, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cxLarge, 8) + TEST_FIELD_SIZE (ITEMSPACING, cyLarge, 4) + TEST_FIELD_ALIGN (ITEMSPACING, cyLarge, 4) + TEST_FIELD_OFFSET(ITEMSPACING, cyLarge, 12) +} + static void test_pack_LPBROWSEINFOA(void) { /* LPBROWSEINFOA */ @@ -1766,6 +3593,25 @@ static void test_pack_QCMINFO_IDMAP_PLACEMENT(void) TEST_FIELD_OFFSET(QCMINFO_IDMAP_PLACEMENT, fFlags, 4) } +static void test_pack_SFV_CREATE(void) +{ + /* SFV_CREATE (pack 8) */ + TEST_TYPE_SIZE (SFV_CREATE, 16) + TEST_TYPE_ALIGN (SFV_CREATE, 4) + TEST_FIELD_SIZE (SFV_CREATE, cbSize, 4) + TEST_FIELD_ALIGN (SFV_CREATE, cbSize, 4) + TEST_FIELD_OFFSET(SFV_CREATE, cbSize, 0) + TEST_FIELD_SIZE (SFV_CREATE, pshf, 4) + TEST_FIELD_ALIGN (SFV_CREATE, pshf, 4) + TEST_FIELD_OFFSET(SFV_CREATE, pshf, 4) + TEST_FIELD_SIZE (SFV_CREATE, psvOuter, 4) + TEST_FIELD_ALIGN (SFV_CREATE, psvOuter, 4) + TEST_FIELD_OFFSET(SFV_CREATE, psvOuter, 8) + TEST_FIELD_SIZE (SFV_CREATE, psfvcb, 4) + TEST_FIELD_ALIGN (SFV_CREATE, psfvcb, 4) + TEST_FIELD_OFFSET(SFV_CREATE, psfvcb, 12) +} + static void test_pack_SHChangeDWORDAsIDList(void) { /* SHChangeDWORDAsIDList (pack 1) */ @@ -1872,6 +3718,8 @@ static void test_pack_TBINFO(void) TEST_FIELD_OFFSET(TBINFO, uFlags, 4) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_APPBARDATA(); @@ -1910,6 +3758,7 @@ static void test_pack(void) test_pack_HYPER_SIZEDARR(); test_pack_IID(); test_pack_ITEMIDLIST(); + test_pack_ITEMSPACING(); test_pack_LPBLOB(); test_pack_LPBROWSEINFOA(); test_pack_LPBROWSEINFOW(); @@ -1968,6 +3817,7 @@ static void test_pack(void) test_pack_RemHMETAFILEPICT(); test_pack_RemHPALETTE(); test_pack_SCODE(); + test_pack_SFV_CREATE(); test_pack_SHChangeDWORDAsIDList(); test_pack_SHChangeNotifyEntry(); test_pack_SHChangeProductKeyAsIDList(); @@ -2013,9 +3863,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/shell32/msg.h b/rostests/winetests/shell32/msg.h new file mode 100644 index 00000000000..361ccdbf598 --- /dev/null +++ b/rostests/winetests/shell32/msg.h @@ -0,0 +1,294 @@ +/* Message Sequence Testing Code + * + * Copyright (C) 2007 James Hawkins + * Copyright (C) 2007 Lei Zhang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include "wine/test.h" + +/* undocumented SWP flags - from SDK 3.1 */ +#define SWP_NOCLIENTSIZE 0x0800 +#define SWP_NOCLIENTMOVE 0x1000 + +typedef enum +{ + sent = 0x1, + posted = 0x2, + parent = 0x4, + wparam = 0x8, + lparam = 0x10, + defwinproc = 0x20, + beginpaint = 0x40, + optional = 0x80, + hook = 0x100, + winevent_hook =0x200, + id = 0x400 +} msg_flags_t; + +struct message +{ + UINT message; /* the WM_* code */ + msg_flags_t flags; /* message props */ + WPARAM wParam; /* expected value of wParam */ + LPARAM lParam; /* expected value of lParam */ + UINT id; /* extra message data: id of the window, + notify code etc. */ +}; + +struct msg_sequence +{ + int count; + int size; + struct message *sequence; +}; + +static void add_message(struct msg_sequence **seq, int sequence_index, + const struct message *msg) +{ + struct msg_sequence *msg_seq = seq[sequence_index]; + + if (!msg_seq->sequence) + { + msg_seq->size = 10; + msg_seq->sequence = HeapAlloc(GetProcessHeap(), 0, + msg_seq->size * sizeof (struct message)); + } + + if (msg_seq->count == msg_seq->size) + { + msg_seq->size *= 2; + msg_seq->sequence = HeapReAlloc(GetProcessHeap(), 0, + msg_seq->sequence, + msg_seq->size * sizeof (struct message)); + } + + assert(msg_seq->sequence); + + msg_seq->sequence[msg_seq->count].message = msg->message; + msg_seq->sequence[msg_seq->count].flags = msg->flags; + msg_seq->sequence[msg_seq->count].wParam = msg->wParam; + msg_seq->sequence[msg_seq->count].lParam = msg->lParam; + msg_seq->sequence[msg_seq->count].id = msg->id; + + msg_seq->count++; +} + +static void flush_sequence(struct msg_sequence **seg, int sequence_index) +{ + struct msg_sequence *msg_seq = seg[sequence_index]; + HeapFree(GetProcessHeap(), 0, msg_seq->sequence); + msg_seq->sequence = NULL; + msg_seq->count = msg_seq->size = 0; +} + +static void flush_sequences(struct msg_sequence **seq, int n) +{ + int i; + + for (i = 0; i < n; i++) + flush_sequence(seq, i); +} + +static void ok_sequence_(struct msg_sequence **seq, int sequence_index, + const struct message *expected, const char *context, int todo, + const char *file, int line) +{ + struct msg_sequence *msg_seq = seq[sequence_index]; + static const struct message end_of_sequence = {0, 0, 0, 0}; + const struct message *actual, *sequence; + int failcount = 0; + + add_message(seq, sequence_index, &end_of_sequence); + + sequence = msg_seq->sequence; + actual = sequence; + + while (expected->message && actual->message) + { + trace_( file, line)("expected %04x - actual %04x\n", expected->message, actual->message); + + if (expected->message == actual->message) + { + if (expected->flags & wparam) + { + if (expected->wParam != actual->wParam && todo) + { + todo_wine + { + failcount++; + ok_(file, line) (FALSE, + "%s: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n", + context, expected->message, expected->wParam, actual->wParam); + } + } + else + { + ok_(file, line) (expected->wParam == actual->wParam, + "%s: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n", + context, expected->message, expected->wParam, actual->wParam); + } + } + + if (expected->flags & lparam) + { + if (expected->lParam != actual->lParam && todo) + { + todo_wine + { + failcount++; + ok_(file, line) (FALSE, + "%s: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", + context, expected->message, expected->lParam, actual->lParam); + } + } + else + { + ok_(file, line) (expected->lParam == actual->lParam, + "%s: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", + context, expected->message, expected->lParam, actual->lParam); + } + } + + if (expected->flags & id) + { + if (expected->id != actual->id && expected->flags & optional) + { + expected++; + continue; + } + if (expected->id != actual->id && todo) + { + todo_wine + { + failcount++; + ok_(file, line) (FALSE, + "%s: in msg 0x%04x expecting id 0x%x got 0x%x\n", + context, expected->message, expected->id, actual->id); + } + } + else + { + ok_(file, line) (expected->id == actual->id, + "%s: in msg 0x%04x expecting id 0x%x got 0x%x\n", + context, expected->message, expected->id, actual->id); + } + } + + if ((expected->flags & defwinproc) != (actual->flags & defwinproc) && todo) + { + todo_wine + { + failcount++; + ok_(file, line) (FALSE, + "%s: the msg 0x%04x should %shave been sent by DefWindowProc\n", + context, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); + } + } + else + { + ok_(file, line) ((expected->flags & defwinproc) == (actual->flags & defwinproc), + "%s: the msg 0x%04x should %shave been sent by DefWindowProc\n", + context, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); + } + + ok_(file, line) ((expected->flags & beginpaint) == (actual->flags & beginpaint), + "%s: the msg 0x%04x should %shave been sent by BeginPaint\n", + context, expected->message, (expected->flags & beginpaint) ? "" : "NOT "); + ok_(file, line) ((expected->flags & (sent|posted)) == (actual->flags & (sent|posted)), + "%s: the msg 0x%04x should have been %s\n", + context, expected->message, (expected->flags & posted) ? "posted" : "sent"); + ok_(file, line) ((expected->flags & parent) == (actual->flags & parent), + "%s: the msg 0x%04x was expected in %s\n", + context, expected->message, (expected->flags & parent) ? "parent" : "child"); + ok_(file, line) ((expected->flags & hook) == (actual->flags & hook), + "%s: the msg 0x%04x should have been sent by a hook\n", + context, expected->message); + ok_(file, line) ((expected->flags & winevent_hook) == (actual->flags & winevent_hook), + "%s: the msg 0x%04x should have been sent by a winevent hook\n", + context, expected->message); + expected++; + actual++; + } + else if (expected->flags & optional) + expected++; + else if (todo) + { + failcount++; + todo_wine + { + ok_(file, line) (FALSE, "%s: the msg 0x%04x was expected, but got msg 0x%04x instead\n", + context, expected->message, actual->message); + } + + flush_sequence(seq, sequence_index); + return; + } + else + { + ok_(file, line) (FALSE, "%s: the msg 0x%04x was expected, but got msg 0x%04x instead\n", + context, expected->message, actual->message); + expected++; + actual++; + } + } + + /* skip all optional trailing messages */ + while (expected->message && ((expected->flags & optional))) + expected++; + + if (todo) + { + todo_wine + { + if (expected->message || actual->message) + { + failcount++; + ok_(file, line) (FALSE, "%s: the msg sequence is not complete: expected %04x - actual %04x\n", + context, expected->message, actual->message); + } + } + } + else if (expected->message || actual->message) + { + ok_(file, line) (FALSE, "%s: the msg sequence is not complete: expected %04x - actual %04x\n", + context, expected->message, actual->message); + } + + if(todo && !failcount) /* succeeded yet marked todo */ + { + todo_wine + { + ok_(file, line)(TRUE, "%s: marked \"todo_wine\" but succeeds\n", context); + } + } + + flush_sequence(seq, sequence_index); +} + +#define ok_sequence(seq, index, exp, contx, todo) \ + ok_sequence_(seq, index, (exp), (contx), (todo), __FILE__, __LINE__) + + +static void init_msg_sequences(struct msg_sequence **seq, int n) +{ + int i; + + for (i = 0; i < n; i++) + seq[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct msg_sequence)); +} diff --git a/rostests/winetests/shell32/progman_dde.c b/rostests/winetests/shell32/progman_dde.c index 333e1f1e16b..d7bf4326a30 100644 --- a/rostests/winetests/shell32/progman_dde.c +++ b/rostests/winetests/shell32/progman_dde.c @@ -149,7 +149,6 @@ static void init_strings(void) { HKEY key; DWORD size; - LONG res; /* Older Win9x and NT4 */ @@ -162,7 +161,7 @@ static void init_strings(void) RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &key); size = sizeof(commonprograms); - res = RegQueryValueExA(key, "Common Programs", NULL, NULL, (LPBYTE)&commonprograms, &size); + RegQueryValueExA(key, "Common Programs", NULL, NULL, (LPBYTE)&commonprograms, &size); RegCloseKey(key); } diff --git a/rostests/winetests/shell32/shell32.rbuild b/rostests/winetests/shell32/shell32.rbuild index 81f764b220e..9f9d037be52 100644 --- a/rostests/winetests/shell32/shell32.rbuild +++ b/rostests/winetests/shell32/shell32.rbuild @@ -24,10 +24,10 @@ shlexec.c shlfileop.c shlfolder.c + shlview.c string.c systray.c testlist.c - shfldr_netplaces.c shfldr_special.c rsrc.rc diff --git a/rostests/winetests/shell32/shelllink.c b/rostests/winetests/shell32/shelllink.c index bb2d5b366db..1b38b0dc82a 100755 --- a/rostests/winetests/shell32/shelllink.c +++ b/rostests/winetests/shell32/shelllink.c @@ -92,7 +92,7 @@ static LPITEMIDLIST path_to_pidl(const char* path) MultiByteToWideChar(CP_ACP, 0, path, -1, pathW, len); r=pSHILCreateFromPath(pathW, &pidl, NULL); - ok(SUCCEEDED(r), "SHILCreateFromPath failed (0x%08x)\n", r); + ok(r == S_OK, "SHILCreateFromPath failed (0x%08x)\n", r); HeapFree(GetProcessHeap(), 0, pathW); } return pidl; @@ -117,44 +117,53 @@ static void test_get_set(void) r = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkA, (LPVOID*)&sl); - ok(SUCCEEDED(r), "no IID_IShellLinkA (0x%08x)\n", r); - if (FAILED(r)) + ok(r == S_OK, "no IID_IShellLinkA (0x%08x)\n", r); + if (r != S_OK) return; /* Test Getting / Setting the description */ strcpy(buffer,"garbage"); r = IShellLinkA_GetDescription(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetDescription failed (0x%08x)\n", r); + ok(r == S_OK, "GetDescription failed (0x%08x)\n", r); ok(*buffer=='\0', "GetDescription returned '%s'\n", buffer); str="Some description"; r = IShellLinkA_SetDescription(sl, str); - ok(SUCCEEDED(r), "SetDescription failed (0x%08x)\n", r); + ok(r == S_OK, "SetDescription failed (0x%08x)\n", r); strcpy(buffer,"garbage"); r = IShellLinkA_GetDescription(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetDescription failed (0x%08x)\n", r); + ok(r == S_OK, "GetDescription failed (0x%08x)\n", r); ok(lstrcmp(buffer,str)==0, "GetDescription returned '%s'\n", buffer); + r = IShellLinkA_SetDescription(sl, NULL); + ok(r == S_OK, "SetDescription failed (0x%08x)\n", r); + + strcpy(buffer,"garbage"); + r = IShellLinkA_GetDescription(sl, buffer, sizeof(buffer)); + ok(r == S_OK, "GetDescription failed (0x%08x)\n", r); + ok(*buffer=='\0' || broken(lstrcmp(buffer,str)==0), "GetDescription returned '%s'\n", buffer); /* NT4 */ + + /* Test Getting / Setting the work directory */ strcpy(buffer,"garbage"); r = IShellLinkA_GetWorkingDirectory(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetWorkingDirectory failed (0x%08x)\n", r); + ok(r == S_OK, "GetWorkingDirectory failed (0x%08x)\n", r); ok(*buffer=='\0', "GetWorkingDirectory returned '%s'\n", buffer); str="c:\\nonexistent\\directory"; r = IShellLinkA_SetWorkingDirectory(sl, str); - ok(SUCCEEDED(r), "SetWorkingDirectory failed (0x%08x)\n", r); + ok(r == S_OK, "SetWorkingDirectory failed (0x%08x)\n", r); strcpy(buffer,"garbage"); r = IShellLinkA_GetWorkingDirectory(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetWorkingDirectory failed (0x%08x)\n", r); + ok(r == S_OK, "GetWorkingDirectory failed (0x%08x)\n", r); ok(lstrcmpi(buffer,str)==0, "GetWorkingDirectory returned '%s'\n", buffer); /* Test Getting / Setting the path */ strcpy(buffer,"garbage"); r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH); - ok(SUCCEEDED(r), "GetPath failed (0x%08x)\n", r); + todo_wine ok(r == S_FALSE || broken(r == S_OK) /* NT4/W2K */, "GetPath failed (0x%08x)\n", r); ok(*buffer=='\0', "GetPath returned '%s'\n", buffer); CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, @@ -175,7 +184,7 @@ static void test_get_set(void) strcpy(buffer,"garbage"); r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH); - ok(SUCCEEDED(r), "GetPath failed (0x%08x)\n", r); + todo_wine ok(r == S_FALSE, "GetPath failed (0x%08x)\n", r); ok(*buffer=='\0', "GetPath returned '%s'\n", buffer); /* Win98 returns S_FALSE, but WinXP returns S_OK */ @@ -185,7 +194,7 @@ static void test_get_set(void) strcpy(buffer,"garbage"); r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH); - ok(SUCCEEDED(r), "GetPath failed (0x%08x)\n", r); + ok(r == S_OK, "GetPath failed (0x%08x)\n", r); ok(lstrcmpi(buffer,str)==0, "GetPath returned '%s'\n", buffer); /* Get some real path to play with */ @@ -195,8 +204,8 @@ static void test_get_set(void) /* Test the interaction of SetPath and SetIDList */ tmp_pidl=NULL; r = IShellLinkA_GetIDList(sl, &tmp_pidl); - ok(SUCCEEDED(r), "GetIDList failed (0x%08x)\n", r); - if (SUCCEEDED(r)) + todo_wine ok(r == S_OK, "GetIDList failed (0x%08x)\n", r); + if (r == S_OK) { BOOL ret; @@ -218,16 +227,16 @@ static void test_get_set(void) LPITEMIDLIST second_pidl; r = IShellLinkA_SetIDList(sl, pidl); - ok(SUCCEEDED(r), "SetIDList failed (0x%08x)\n", r); + ok(r == S_OK, "SetIDList failed (0x%08x)\n", r); tmp_pidl=NULL; r = IShellLinkA_GetIDList(sl, &tmp_pidl); - ok(SUCCEEDED(r), "GetIDList failed (0x%08x)\n", r); + ok(r == S_OK, "GetIDList failed (0x%08x)\n", r); ok(tmp_pidl && pILIsEqual(pidl, tmp_pidl), "GetIDList returned an incorrect pidl\n"); r = IShellLinkA_GetIDList(sl, &second_pidl); - ok(SUCCEEDED(r), "GetIDList failed (0x%08x)\n", r); + ok(r == S_OK, "GetIDList failed (0x%08x)\n", r); ok(second_pidl && pILIsEqual(pidl, second_pidl), "GetIDList returned an incorrect pidl\n"); ok(second_pidl != tmp_pidl, "pidls are the same\n"); @@ -238,7 +247,7 @@ static void test_get_set(void) strcpy(buffer,"garbage"); r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH); - ok(SUCCEEDED(r), "GetPath failed (0x%08x)\n", r); + ok(r == S_OK, "GetPath failed (0x%08x)\n", r); todo_wine ok(lstrcmpi(buffer, mypath)==0, "GetPath returned '%s'\n", buffer); @@ -273,44 +282,44 @@ static void test_get_set(void) /* Test Getting / Setting the arguments */ strcpy(buffer,"garbage"); r = IShellLinkA_GetArguments(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "GetArguments failed (0x%08x)\n", r); ok(*buffer=='\0', "GetArguments returned '%s'\n", buffer); str="param1 \"spaced param2\""; r = IShellLinkA_SetArguments(sl, str); - ok(SUCCEEDED(r), "SetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "SetArguments failed (0x%08x)\n", r); strcpy(buffer,"garbage"); r = IShellLinkA_GetArguments(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "GetArguments failed (0x%08x)\n", r); ok(lstrcmp(buffer,str)==0, "GetArguments returned '%s'\n", buffer); strcpy(buffer,"garbage"); r = IShellLinkA_SetArguments(sl, NULL); - ok(SUCCEEDED(r), "SetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "SetArguments failed (0x%08x)\n", r); r = IShellLinkA_GetArguments(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "GetArguments failed (0x%08x)\n", r); ok(!buffer[0] || lstrcmp(buffer,str)==0, "GetArguments returned '%s'\n", buffer); strcpy(buffer,"garbage"); r = IShellLinkA_SetArguments(sl, ""); - ok(SUCCEEDED(r), "SetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "SetArguments failed (0x%08x)\n", r); r = IShellLinkA_GetArguments(sl, buffer, sizeof(buffer)); - ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r); + ok(r == S_OK, "GetArguments failed (0x%08x)\n", r); ok(!buffer[0], "GetArguments returned '%s'\n", buffer); /* Test Getting / Setting showcmd */ i=0xdeadbeef; r = IShellLinkA_GetShowCmd(sl, &i); - ok(SUCCEEDED(r), "GetShowCmd failed (0x%08x)\n", r); + ok(r == S_OK, "GetShowCmd failed (0x%08x)\n", r); ok(i==SW_SHOWNORMAL, "GetShowCmd returned %d\n", i); r = IShellLinkA_SetShowCmd(sl, SW_SHOWMAXIMIZED); - ok(SUCCEEDED(r), "SetShowCmd failed (0x%08x)\n", r); + ok(r == S_OK, "SetShowCmd failed (0x%08x)\n", r); i=0xdeadbeef; r = IShellLinkA_GetShowCmd(sl, &i); - ok(SUCCEEDED(r), "GetShowCmd failed (0x%08x)\n", r); + ok(r == S_OK, "GetShowCmd failed (0x%08x)\n", r); ok(i==SW_SHOWMAXIMIZED, "GetShowCmd returned %d'\n", i); /* Test Getting / Setting the icon */ @@ -318,33 +327,33 @@ static void test_get_set(void) strcpy(buffer,"garbage"); r = IShellLinkA_GetIconLocation(sl, buffer, sizeof(buffer), &i); todo_wine { - ok(SUCCEEDED(r), "GetIconLocation failed (0x%08x)\n", r); + ok(r == S_OK, "GetIconLocation failed (0x%08x)\n", r); } ok(*buffer=='\0', "GetIconLocation returned '%s'\n", buffer); ok(i==0, "GetIconLocation returned %d\n", i); str="c:\\nonexistent\\file"; r = IShellLinkA_SetIconLocation(sl, str, 0xbabecafe); - ok(SUCCEEDED(r), "SetIconLocation failed (0x%08x)\n", r); + ok(r == S_OK, "SetIconLocation failed (0x%08x)\n", r); i=0xdeadbeef; r = IShellLinkA_GetIconLocation(sl, buffer, sizeof(buffer), &i); - ok(SUCCEEDED(r), "GetIconLocation failed (0x%08x)\n", r); + ok(r == S_OK, "GetIconLocation failed (0x%08x)\n", r); ok(lstrcmpi(buffer,str)==0, "GetIconLocation returned '%s'\n", buffer); ok(i==0xbabecafe, "GetIconLocation returned %d'\n", i); /* Test Getting / Setting the hot key */ w=0xbeef; r = IShellLinkA_GetHotkey(sl, &w); - ok(SUCCEEDED(r), "GetHotkey failed (0x%08x)\n", r); + ok(r == S_OK, "GetHotkey failed (0x%08x)\n", r); ok(w==0, "GetHotkey returned %d\n", w); r = IShellLinkA_SetHotkey(sl, 0x5678); - ok(SUCCEEDED(r), "SetHotkey failed (0x%08x)\n", r); + ok(r == S_OK, "SetHotkey failed (0x%08x)\n", r); w=0xbeef; r = IShellLinkA_GetHotkey(sl, &w); - ok(SUCCEEDED(r), "GetHotkey failed (0x%08x)\n", r); + ok(r == S_OK, "GetHotkey failed (0x%08x)\n", r); ok(w==0x5678, "GetHotkey returned %d'\n", w); IShellLinkA_Release(sl); @@ -372,19 +381,19 @@ void create_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int save_fails) r = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkA, (LPVOID*)&sl); - lok(SUCCEEDED(r), "no IID_IShellLinkA (0x%08x)\n", r); - if (FAILED(r)) + lok(r == S_OK, "no IID_IShellLinkA (0x%08x)\n", r); + if (r != S_OK) return; if (desc->description) { r = IShellLinkA_SetDescription(sl, desc->description); - lok(SUCCEEDED(r), "SetDescription failed (0x%08x)\n", r); + lok(r == S_OK, "SetDescription failed (0x%08x)\n", r); } if (desc->workdir) { r = IShellLinkA_SetWorkingDirectory(sl, desc->workdir); - lok(SUCCEEDED(r), "SetWorkingDirectory failed (0x%08x)\n", r); + lok(r == S_OK, "SetWorkingDirectory failed (0x%08x)\n", r); } if (desc->path) { @@ -394,44 +403,80 @@ void create_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int save_fails) if (desc->pidl) { r = IShellLinkA_SetIDList(sl, desc->pidl); - lok(SUCCEEDED(r), "SetIDList failed (0x%08x)\n", r); + lok(r == S_OK, "SetIDList failed (0x%08x)\n", r); } if (desc->arguments) { r = IShellLinkA_SetArguments(sl, desc->arguments); - lok(SUCCEEDED(r), "SetArguments failed (0x%08x)\n", r); + lok(r == S_OK, "SetArguments failed (0x%08x)\n", r); } if (desc->showcmd) { r = IShellLinkA_SetShowCmd(sl, desc->showcmd); - lok(SUCCEEDED(r), "SetShowCmd failed (0x%08x)\n", r); + lok(r == S_OK, "SetShowCmd failed (0x%08x)\n", r); } if (desc->icon) { r = IShellLinkA_SetIconLocation(sl, desc->icon, desc->icon_id); - lok(SUCCEEDED(r), "SetIconLocation failed (0x%08x)\n", r); + lok(r == S_OK, "SetIconLocation failed (0x%08x)\n", r); } if (desc->hotkey) { r = IShellLinkA_SetHotkey(sl, desc->hotkey); - lok(SUCCEEDED(r), "SetHotkey failed (0x%08x)\n", r); + lok(r == S_OK, "SetHotkey failed (0x%08x)\n", r); } r = IShellLinkW_QueryInterface(sl, &IID_IPersistFile, (LPVOID*)&pf); - lok(SUCCEEDED(r), "no IID_IPersistFile (0x%08x)\n", r); - if (SUCCEEDED(r)) + lok(r == S_OK, "no IID_IPersistFile (0x%08x)\n", r); + if (r == S_OK) { + LPOLESTR str; + + if (0) + { + /* crashes on XP */ + r = IPersistFile_GetCurFile(pf, NULL); + } + + /* test GetCurFile before ::Save */ + str = (LPWSTR)0xdeadbeef; + r = IPersistFile_GetCurFile(pf, &str); + lok(r == S_FALSE || + broken(r == S_OK), /* shell32 < 5.0 */ + "got 0x%08x\n", r); + lok(str == NULL, "got %p\n", str); + r = IPersistFile_Save(pf, path, TRUE); if (save_fails) { todo_wine { - lok(SUCCEEDED(r), "save failed (0x%08x)\n", r); + lok(r == S_OK, "save failed (0x%08x)\n", r); } } else { - lok(SUCCEEDED(r), "save failed (0x%08x)\n", r); + lok(r == S_OK, "save failed (0x%08x)\n", r); } + + /* test GetCurFile after ::Save */ + r = IPersistFile_GetCurFile(pf, &str); + lok(r == S_OK, "got 0x%08x\n", r); + lok(str != NULL || + broken(str == NULL), /* shell32 < 5.0 */ + "Didn't expect NULL\n"); + if (str != NULL) + { + IMalloc *pmalloc; + + lok(!winetest_strcmpW(path, str), "Expected %s, got %s\n", + wine_dbgstr_w(path), wine_dbgstr_w(str)); + + SHGetMalloc(&pmalloc); + IMalloc_Free(pmalloc, str); + } + else + win_skip("GetCurFile fails on shell32 < 5.0\n"); + IPersistFile_Release(pf); } @@ -444,25 +489,54 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) IShellLinkA *sl; IPersistFile *pf; char buffer[INFOTIPSIZE]; + LPOLESTR str; r = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkA, (LPVOID*)&sl); - lok(SUCCEEDED(r), "no IID_IShellLinkA (0x%08x)\n", r); - if (FAILED(r)) + lok(r == S_OK, "no IID_IShellLinkA (0x%08x)\n", r); + if (r != S_OK) return; r = IShellLinkA_QueryInterface(sl, &IID_IPersistFile, (LPVOID*)&pf); - lok(SUCCEEDED(r), "no IID_IPersistFile (0x%08x)\n", r); - if (FAILED(r)) + lok(r == S_OK, "no IID_IPersistFile (0x%08x)\n", r); + if (r != S_OK) { IShellLinkA_Release(sl); return; } + /* test GetCurFile before ::Load */ + str = (LPWSTR)0xdeadbeef; + r = IPersistFile_GetCurFile(pf, &str); + lok(r == S_FALSE || + broken(r == S_OK), /* shell32 < 5.0 */ + "got 0x%08x\n", r); + lok(str == NULL, "got %p\n", str); + r = IPersistFile_Load(pf, path, STGM_READ); - lok(SUCCEEDED(r), "load failed (0x%08x)\n", r); + lok(r == S_OK, "load failed (0x%08x)\n", r); + + /* test GetCurFile after ::Save */ + r = IPersistFile_GetCurFile(pf, &str); + lok(r == S_OK, "got 0x%08x\n", r); + lok(str != NULL || + broken(str == NULL), /* shell32 < 5.0 */ + "Didn't expect NULL\n"); + if (str != NULL) + { + IMalloc *pmalloc; + + lok(!winetest_strcmpW(path, str), "Expected %s, got %s\n", + wine_dbgstr_w(path), wine_dbgstr_w(str)); + + SHGetMalloc(&pmalloc); + IMalloc_Free(pmalloc, str); + } + else + win_skip("GetCurFile fails on shell32 < 5.0\n"); + IPersistFile_Release(pf); - if (FAILED(r)) + if (r != S_OK) { IShellLinkA_Release(sl); return; @@ -472,7 +546,7 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) { strcpy(buffer,"garbage"); r = IShellLinkA_GetDescription(sl, buffer, sizeof(buffer)); - lok(SUCCEEDED(r), "GetDescription failed (0x%08x)\n", r); + lok(r == S_OK, "GetDescription failed (0x%08x)\n", r); lok_todo_4(0x1, lstrcmp(buffer, desc->description)==0, "GetDescription returned '%s' instead of '%s'\n", buffer, desc->description); @@ -481,7 +555,7 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) { strcpy(buffer,"garbage"); r = IShellLinkA_GetWorkingDirectory(sl, buffer, sizeof(buffer)); - lok(SUCCEEDED(r), "GetWorkingDirectory failed (0x%08x)\n", r); + lok(r == S_OK, "GetWorkingDirectory failed (0x%08x)\n", r); lok_todo_4(0x2, lstrcmpi(buffer, desc->workdir)==0, "GetWorkingDirectory returned '%s' instead of '%s'\n", buffer, desc->workdir); @@ -499,7 +573,7 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) { LPITEMIDLIST pidl=NULL; r = IShellLinkA_GetIDList(sl, &pidl); - lok(SUCCEEDED(r), "GetIDList failed (0x%08x)\n", r); + lok(r == S_OK, "GetIDList failed (0x%08x)\n", r); lok_todo_2(0x8, pILIsEqual(pidl, desc->pidl), "GetIDList returned an incorrect pidl\n"); } @@ -507,7 +581,7 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) { int i=0xdeadbeef; r = IShellLinkA_GetShowCmd(sl, &i); - lok(SUCCEEDED(r), "GetShowCmd failed (0x%08x)\n", r); + lok(r == S_OK, "GetShowCmd failed (0x%08x)\n", r); lok_todo_4(0x10, i==desc->showcmd, "GetShowCmd returned 0x%0x instead of 0x%0x\n", i, desc->showcmd); @@ -517,7 +591,7 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) int i=0xdeadbeef; strcpy(buffer,"garbage"); r = IShellLinkA_GetIconLocation(sl, buffer, sizeof(buffer), &i); - lok(SUCCEEDED(r), "GetIconLocation failed (0x%08x)\n", r); + lok(r == S_OK, "GetIconLocation failed (0x%08x)\n", r); lok_todo_4(0x20, lstrcmpi(buffer, desc->icon)==0, "GetIconLocation returned '%s' instead of '%s'\n", buffer, desc->icon); @@ -529,7 +603,7 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo) { WORD i=0xbeef; r = IShellLinkA_GetHotkey(sl, &i); - lok(SUCCEEDED(r), "GetHotkey failed (0x%08x)\n", r); + lok(r == S_OK, "GetHotkey failed (0x%08x)\n", r); lok_todo_4(0x40, i==desc->hotkey, "GetHotkey returned 0x%04x instead of 0x%04x\n", i, desc->hotkey); @@ -744,10 +818,11 @@ static void test_datalink(void) r = IShellLinkW_SetPath(sl, lnk); ok(r == S_OK, "set path failed\n"); - /* - * The following crashes: - * r = IShellLinkDataList_GetFlags( dl, NULL ); - */ +if (0) +{ + /* the following crashes */ + r = IShellLinkDataList_GetFlags( dl, NULL ); +} flags = 0; r = IShellLinkDataList_GetFlags( dl, &flags ); @@ -812,8 +887,8 @@ START_TEST(shelllink) pGetShortPathNameA = (void *)GetProcAddress(hkernel32, "GetShortPathNameA"); r = CoInitialize(NULL); - ok(SUCCEEDED(r), "CoInitialize failed (0x%08x)\n", r); - if (FAILED(r)) + ok(r == S_OK, "CoInitialize failed (0x%08x)\n", r); + if (r != S_OK) return; test_get_set(); diff --git a/rostests/winetests/shell32/shellpath.c b/rostests/winetests/shell32/shellpath.c index c035aaf1780..b874b5a1ee4 100644 --- a/rostests/winetests/shell32/shellpath.c +++ b/rostests/winetests/shell32/shellpath.c @@ -201,7 +201,7 @@ static void loadShell32(void) { HRESULT hr = pSHGetMalloc(&pMalloc); - ok(SUCCEEDED(hr), "SHGetMalloc failed: 0x%08x\n", hr); + ok(hr == S_OK, "SHGetMalloc failed: 0x%08x\n", hr); ok(pMalloc != NULL, "SHGetMalloc returned a NULL IMalloc\n"); } @@ -303,92 +303,66 @@ static const char *printGUID(const GUID *guid, char * guidSTR) return guidSTR; } -static void testSHGetFolderLocationInvalidArgs(void) -{ - LPITEMIDLIST pidl; - HRESULT hr; - - if (!pSHGetFolderLocation) return; - - /* check a bogus CSIDL: */ - pidl = NULL; - hr = pSHGetFolderLocation(NULL, 0xeeee, NULL, 0, &pidl); - ok(hr == E_INVALIDARG, - "SHGetFolderLocation(NULL, 0xeeee, NULL, 0, &pidl) returned 0x%08x, expected E_INVALIDARG\n", hr); - if (SUCCEEDED(hr)) - IMalloc_Free(pMalloc, pidl); - /* check a bogus user token: */ - pidl = NULL; - hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, (HANDLE)2, 0, &pidl); - ok(hr == E_FAIL || hr == E_HANDLE, - "SHGetFolderLocation(NULL, CSIDL_FAVORITES, 2, 0, &pidl) returned 0x%08x, expected E_FAIL or E_HANDLE\n", hr); - if (SUCCEEDED(hr)) - IMalloc_Free(pMalloc, pidl); - /* a NULL pidl pointer crashes, so don't test it */ -} - -static void testSHGetSpecialFolderLocationInvalidArgs(void) +static void test_parameters(void) { LPITEMIDLIST pidl = NULL; - HRESULT hr; - - if (!pSHGetSpecialFolderLocation) return; - - /* SHGetSpecialFolderLocation(NULL, 0, NULL) crashes */ - hr = pSHGetSpecialFolderLocation(NULL, 0xeeee, &pidl); - ok(hr == E_INVALIDARG, - "SHGetSpecialFolderLocation(NULL, 0xeeee, &pidl) returned 0x%08x, " - "expected E_INVALIDARG\n", hr); -} - -static void testSHGetFolderPathInvalidArgs(void) -{ char path[MAX_PATH]; HRESULT hr; - if (!pSHGetFolderPathA) return; + if (pSHGetFolderLocation) + { + /* check a bogus CSIDL: */ + pidl = NULL; + hr = pSHGetFolderLocation(NULL, 0xeeee, NULL, 0, &pidl); + ok(hr == E_INVALIDARG, "got 0x%08x, expected E_INVALIDARG\n", hr); + if (hr == S_OK) IMalloc_Free(pMalloc, pidl); - /* expect 2's a bogus handle, especially since we didn't open it */ - hr = pSHGetFolderPathA(NULL, CSIDL_DESKTOP, (HANDLE)2, - SHGFP_TYPE_DEFAULT, path); - ok(hr == E_FAIL || - hr == E_HANDLE || /* Windows Vista and 2008 */ - broken(hr == S_OK), /* Windows 2000 and Me */ - "SHGetFolderPathA(NULL, CSIDL_DESKTOP, 2, SHGFP_TYPE_DEFAULT, path) returned 0x%08x, expected E_FAIL\n", hr); - hr = pSHGetFolderPathA(NULL, 0xeeee, NULL, SHGFP_TYPE_DEFAULT, path); - ok(hr == E_INVALIDARG, - "SHGetFolderPathA(NULL, 0xeeee, NULL, SHGFP_TYPE_DEFAULT, path) returned 0x%08x, expected E_INVALIDARG\n", hr); -} + /* check a bogus user token: */ + pidl = NULL; + hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, (HANDLE)2, 0, &pidl); + ok(hr == E_FAIL || hr == E_HANDLE, "got 0x%08x, expected E_FAIL or E_HANDLE\n", hr); + if (hr == S_OK) IMalloc_Free(pMalloc, pidl); -static void testSHGetSpecialFolderPathInvalidArgs(void) -{ - char path[MAX_PATH]; - BOOL ret; + /* a NULL pidl pointer crashes, so don't test it */ + } - if (!pSHGetSpecialFolderPathA) return; + if (pSHGetSpecialFolderLocation) + { + if (0) + /* crashes */ + SHGetSpecialFolderLocation(NULL, 0, NULL); -#if 0 - ret = pSHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE); - ok(!ret, - "SHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE) returned TRUE, expected FALSE\n"); -#endif - /* odd but true: calling with a NULL path still succeeds if it's a real - * dir (on some windows platform). on winME it generates exception. - */ - ret = pSHGetSpecialFolderPathA(NULL, path, CSIDL_PROGRAMS, FALSE); - ok(ret, - "SHGetSpecialFolderPathA(NULL, path, CSIDL_PROGRAMS, FALSE) returned FALSE, expected TRUE\n"); - ret = pSHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE); - ok(!ret, - "SHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE) returned TRUE, expected FALSE\n"); -} + hr = pSHGetSpecialFolderLocation(NULL, 0xeeee, &pidl); + ok(hr == E_INVALIDARG, "got returned 0x%08x\n", hr); + } -static void testApiParameters(void) -{ - testSHGetFolderLocationInvalidArgs(); - testSHGetSpecialFolderLocationInvalidArgs(); - testSHGetFolderPathInvalidArgs(); - testSHGetSpecialFolderPathInvalidArgs(); + if (pSHGetFolderPathA) + { + /* expect 2's a bogus handle, especially since we didn't open it */ + hr = pSHGetFolderPathA(NULL, CSIDL_DESKTOP, (HANDLE)2, SHGFP_TYPE_DEFAULT, path); + ok(hr == E_FAIL || hr == E_HANDLE || /* Vista and 2k8 */ + broken(hr == S_OK), /* W2k and Me */ "got 0x%08x, expected E_FAIL\n", hr); + + hr = pSHGetFolderPathA(NULL, 0xeeee, NULL, SHGFP_TYPE_DEFAULT, path); + ok(hr == E_INVALIDARG, "got 0x%08x, expected E_INVALIDARG\n", hr); + } + + if (pSHGetSpecialFolderPathA) + { + BOOL ret; + + if (0) + ret = pSHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE); + + /* odd but true: calling with a NULL path still succeeds if it's a real + * dir (on some windows platform). on winME it generates exception. + */ + ret = pSHGetSpecialFolderPathA(NULL, path, CSIDL_PROGRAMS, FALSE); + ok(ret, "got %d\n", ret); + + ret = pSHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE); + ok(!ret, "got %d\n", ret); + } } /* Returns the folder's PIDL type, or 0xff if one can't be found. */ @@ -403,7 +377,7 @@ static BYTE testSHGetFolderLocation(int folder) pidl = NULL; hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl); - if (SUCCEEDED(hr)) + if (hr == S_OK) { if (pidl) { @@ -431,7 +405,7 @@ static BYTE testSHGetSpecialFolderLocation(int folder) pidl = NULL; hr = pSHGetSpecialFolderLocation(NULL, folder, &pidl); - if (SUCCEEDED(hr)) + if (hr == S_OK) { if (pidl) { @@ -447,7 +421,7 @@ static BYTE testSHGetSpecialFolderLocation(int folder) return ret; } -static void testSHGetFolderPath(BOOL optional, int folder) +static void test_SHGetFolderPath(BOOL optional, int folder) { char path[MAX_PATH]; HRESULT hr; @@ -455,11 +429,11 @@ static void testSHGetFolderPath(BOOL optional, int folder) if (!pSHGetFolderPathA) return; hr = pSHGetFolderPathA(NULL, folder, NULL, SHGFP_TYPE_CURRENT, path); - ok(SUCCEEDED(hr) || optional, + ok(hr == S_OK || optional, "SHGetFolderPathA(NULL, %s, NULL, SHGFP_TYPE_CURRENT, path) failed: 0x%08x\n", getFolderName(folder), hr); } -static void testSHGetSpecialFolderPath(BOOL optional, int folder) +static void test_SHGetSpecialFolderPath(BOOL optional, int folder) { char path[MAX_PATH]; BOOL ret; @@ -474,7 +448,7 @@ static void testSHGetSpecialFolderPath(BOOL optional, int folder) getFolderName(folder)); } -static void testShellValues(const struct shellExpectedValues testEntries[], +static void test_ShellValues(const struct shellExpectedValues testEntries[], int numEntries, BOOL optional) { int i; @@ -509,8 +483,8 @@ static void testShellValues(const struct shellExpectedValues testEntries[], case PT_DRIVE: case PT_DRIVE2: case PT_IESPECIAL2: - testSHGetFolderPath(optional, testEntries[i].folder); - testSHGetSpecialFolderPath(optional, testEntries[i].folder); + test_SHGetFolderPath(optional, testEntries[i].folder); + test_SHGetSpecialFolderPath(optional, testEntries[i].folder); break; } } @@ -555,7 +529,7 @@ static void matchGUID(int folder, const GUID *guid, const GUID *guid_alt) pidl = NULL; hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl); - if (SUCCEEDED(hr)) + if (hr == S_OK) { LPITEMIDLIST pidlLast = pILFindLastID(pidl); @@ -580,27 +554,22 @@ static void matchGUID(int folder, const GUID *guid, const GUID *guid_alt) } } -static void testDesktop(void) -{ - testSHGetFolderPath(FALSE, CSIDL_DESKTOP); - testSHGetSpecialFolderPath(FALSE, CSIDL_DESKTOP); -} - /* Checks the PIDL type of all the known values. */ -static void testPidlTypes(void) +static void test_PidlTypes(void) { - testDesktop(); - testShellValues(requiredShellValues, ARRAY_SIZE(requiredShellValues), - FALSE); - testShellValues(optionalShellValues, ARRAY_SIZE(optionalShellValues), - TRUE); + /* Desktop */ + test_SHGetFolderPath(FALSE, CSIDL_DESKTOP); + test_SHGetSpecialFolderPath(FALSE, CSIDL_DESKTOP); + + test_ShellValues(requiredShellValues, ARRAY_SIZE(requiredShellValues), FALSE); + test_ShellValues(optionalShellValues, ARRAY_SIZE(optionalShellValues), TRUE); } /* FIXME: Should be in shobjidl.idl */ DEFINE_GUID(CLSID_NetworkExplorerFolder, 0xF02C1A0D, 0xBE21, 0x4350, 0x88, 0xB0, 0x73, 0x67, 0xFC, 0x96, 0xEF, 0x3C); /* Verifies various shell virtual folders have the correct well-known GUIDs. */ -static void testGUIDs(void) +static void test_GUIDs(void) { matchGUID(CSIDL_BITBUCKET, &CLSID_RecycleBin, NULL); matchGUID(CSIDL_CONTROLS, &CLSID_ControlPanel, NULL); @@ -609,20 +578,20 @@ static void testGUIDs(void) matchGUID(CSIDL_NETWORK, &CLSID_NetworkPlaces, &CLSID_NetworkExplorerFolder); /* Vista and higher */ matchGUID(CSIDL_PERSONAL, &CLSID_MyDocuments, NULL); matchGUID(CSIDL_COMMON_DOCUMENTS, &CLSID_CommonDocuments, NULL); + matchGUID(CSIDL_PRINTERS, &CLSID_Printers, NULL); } /* Verifies various shell paths match the environment variables to which they * correspond. */ -static void testEnvVars(void) +static void test_EnvVars(void) { matchSpecialFolderPathToEnv(CSIDL_PROGRAM_FILES, "ProgramFiles"); matchSpecialFolderPathToEnv(CSIDL_APPDATA, "APPDATA"); matchSpecialFolderPathToEnv(CSIDL_PROFILE, "USERPROFILE"); matchSpecialFolderPathToEnv(CSIDL_WINDOWS, "SystemRoot"); matchSpecialFolderPathToEnv(CSIDL_WINDOWS, "windir"); - matchSpecialFolderPathToEnv(CSIDL_PROGRAM_FILES_COMMON, - "CommonProgramFiles"); + matchSpecialFolderPathToEnv(CSIDL_PROGRAM_FILES_COMMON, "CommonProgramFiles"); /* this is only set on Wine, but can't hurt to verify it: */ matchSpecialFolderPathToEnv(CSIDL_SYSTEM, "winsysdir"); } @@ -715,84 +684,71 @@ static int init(void) return 1; } -/* Subprocess helper 1: test what happens when CSIDL_FAVORITES is set to a - * nonexistent directory. - */ -static void testNonExistentPath1(void) -{ - HRESULT hr; - LPITEMIDLIST pidl; - char *p, path[MAX_PATH]; - - /* test some failure cases first: */ - hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES, NULL, - SHGFP_TYPE_CURRENT, path); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), - "SHGetFolderPath returned 0x%08x, expected 0x80070002\n", hr); - pidl = NULL; - hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, NULL, 0, - &pidl); - ok(hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), - "SHGetFolderLocation returned 0x%08x\n", hr); - if (SUCCEEDED(hr) && pidl) - IMalloc_Free(pMalloc, pidl); - ok(!pSHGetSpecialFolderPathA(NULL, path, CSIDL_FAVORITES, FALSE), - "SHGetSpecialFolderPath succeeded, expected failure\n"); - pidl = NULL; - hr = pSHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidl); - ok(hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), - "SHGetFolderLocation returned 0x%08x\n", hr); - if (SUCCEEDED(hr) && pidl) - IMalloc_Free(pMalloc, pidl); - /* now test success: */ - hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL, - SHGFP_TYPE_CURRENT, path); - if (SUCCEEDED(hr)) - { - BOOL ret; - - trace("CSIDL_FAVORITES was changed to %s\n", path); - ret = CreateDirectoryA(path, NULL); - ok(!ret, - "CreateDirectoryA succeeded but should have failed " - "with ERROR_ALREADY_EXISTS\n"); - if (!ret) - ok(GetLastError() == ERROR_ALREADY_EXISTS, - "CreateDirectoryA failed with %d, " - "expected ERROR_ALREADY_EXISTS\n", - GetLastError()); - p = path + strlen(path); - strcpy(p, "\\desktop.ini"); - DeleteFileA(path); - *p = 0; - SetFileAttributesA( path, FILE_ATTRIBUTE_NORMAL ); - ret = RemoveDirectoryA(path); - ok( ret, "failed to remove %s error %u\n", path, GetLastError() ); - } - ok(SUCCEEDED(hr), - "SHGetFolderPath(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, " - "NULL, SHGFP_TYPE_CURRENT, path) failed: 0x%08x\n", hr); -} - -/* Subprocess helper 2: make sure SHGetFolderPath still succeeds when the - * original value of CSIDL_FAVORITES is restored. - */ -static void testNonExistentPath2(void) -{ - HRESULT hr; - char path[MAX_PATH]; - - hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL, - SHGFP_TYPE_CURRENT, path); - ok(SUCCEEDED(hr), "SHGetFolderPath failed: 0x%08x\n", hr); -} - static void doChild(const char *arg) { + char path[MAX_PATH]; + HRESULT hr; + if (arg[0] == '1') - testNonExistentPath1(); + { + LPITEMIDLIST pidl; + char *p; + + /* test what happens when CSIDL_FAVORITES is set to a nonexistent directory */ + + /* test some failure cases first: */ + hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), + "SHGetFolderPath returned 0x%08x, expected 0x80070002\n", hr); + + pidl = NULL; + hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, NULL, 0, &pidl); + ok(hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), + "SHGetFolderLocation returned 0x%08x\n", hr); + if (hr == S_OK && pidl) IMalloc_Free(pMalloc, pidl); + + ok(!pSHGetSpecialFolderPathA(NULL, path, CSIDL_FAVORITES, FALSE), + "SHGetSpecialFolderPath succeeded, expected failure\n"); + + pidl = NULL; + hr = pSHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidl); + ok(hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), + "SHGetFolderLocation returned 0x%08x\n", hr); + + if (hr == S_OK && pidl) IMalloc_Free(pMalloc, pidl); + + /* now test success: */ + hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL, + SHGFP_TYPE_CURRENT, path); + ok (hr == S_OK, "got 0x%08x\n", hr); + if (hr == S_OK) + { + BOOL ret; + + trace("CSIDL_FAVORITES was changed to %s\n", path); + ret = CreateDirectoryA(path, NULL); + ok(!ret, "expected failure with ERROR_ALREADY_EXISTS\n"); + if (!ret) + ok(GetLastError() == ERROR_ALREADY_EXISTS, + "got %d, expected ERROR_ALREADY_EXISTS\n", GetLastError()); + + p = path + strlen(path); + strcpy(p, "\\desktop.ini"); + DeleteFileA(path); + *p = 0; + SetFileAttributesA( path, FILE_ATTRIBUTE_NORMAL ); + ret = RemoveDirectoryA(path); + ok( ret, "failed to remove %s error %u\n", path, GetLastError() ); + } + } else if (arg[0] == '2') - testNonExistentPath2(); + { + /* make sure SHGetFolderPath still succeeds when the + original value of CSIDL_FAVORITES is restored. */ + hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL, + SHGFP_TYPE_CURRENT, path); + ok(hr == S_OK, "SHGetFolderPath failed: 0x%08x\n", hr); + } } /* Tests the return values from the various shell functions both with and @@ -808,7 +764,7 @@ static void doChild(const char *arg) * covered by other unit tests; I just print out something about failure to * help trace what's going on. */ -static void testNonExistentPath(void) +static void test_NonExistentPath(void) { static const char userShellFolders[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"; @@ -884,7 +840,6 @@ START_TEST(shellpath) loadShell32(); pGetSystemWow64DirectoryA = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetSystemWow64DirectoryA" ); - if (myARGC >= 3) doChild(myARGV[2]); else @@ -894,14 +849,14 @@ START_TEST(shellpath) win_skip("SHGetFolderLocation is not available\n"); /* first test various combinations of parameters: */ - testApiParameters(); + test_parameters(); /* check known values: */ - testPidlTypes(); - testGUIDs(); - testEnvVars(); + test_PidlTypes(); + test_GUIDs(); + test_EnvVars(); testWinDir(); testSystemDir(); - testNonExistentPath(); + test_NonExistentPath(); } } diff --git a/rostests/winetests/shell32/shfldr_netplaces.c b/rostests/winetests/shell32/shfldr_netplaces.c deleted file mode 100644 index a2619f0b1b3..00000000000 --- a/rostests/winetests/shell32/shfldr_netplaces.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Tests for My Network Places shell folder - * - * Copyright 2008 Robert Shearman for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include - -#define COBJMACROS -#define WIN32_LEAN_AND_MEAN -#include -#include "shellapi.h" -#include "shlobj.h" - -#include "wine/test.h" - -static void test_parse_for_entire_network(void) -{ - static const WCHAR entire_network_path[] = { - ':',':','{','2','0','8','D','2','C','6','0','-','3','A','E','A','-', - '1','0','6','9','-','A','2','D','7','-','0','8','0','0','2','B','3','0','3','0','9','D', - '}','\\','E','n','t','i','r','e','N','e','t','w','o','r','k',0 }; - IShellFolder *psfDesktop; - HRESULT hr; - DWORD eaten = 0xdeadbeef; - LPITEMIDLIST pidl; - DWORD attr = ~0; - DWORD expected_attr; - - hr = SHGetDesktopFolder(&psfDesktop); - ok(hr == S_OK, "SHGetDesktopFolder failed with error 0x%x\n", hr); - - hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, (LPWSTR)entire_network_path, &eaten, &pidl, &attr); - ok(hr == S_OK, "IShellFolder_ParseDisplayName failed with error 0x%x\n", hr); - todo_wine - ok(eaten == 0xdeadbeef, "eaten should not have been set to %u\n", eaten); - expected_attr = SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_STORAGEANCESTOR|SFGAO_HASPROPSHEET|SFGAO_CANLINK; - todo_wine - ok(attr == expected_attr, "attr should be 0x%x, not 0x%x\n", expected_attr, attr); - - ILFree(pidl); -} - - -START_TEST(shfldr_netplaces) -{ - test_parse_for_entire_network(); -} diff --git a/rostests/winetests/shell32/shfldr_special.c b/rostests/winetests/shell32/shfldr_special.c index 06533ba8b95..24374bc0843 100644 --- a/rostests/winetests/shell32/shfldr_special.c +++ b/rostests/winetests/shell32/shfldr_special.c @@ -23,6 +23,9 @@ #include #define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + #define WIN32_LEAN_AND_MEAN #include #include "shellapi.h" @@ -30,6 +33,11 @@ #include "wine/test.h" +static inline BOOL SHELL_OsIsUnicode(void) +{ + return !(GetVersion() & 0x80000000); +} + /* Tests for My Network Places */ static void test_parse_for_entire_network(void) { @@ -119,9 +127,101 @@ static void test_parse_for_control_panel(void) ILFree(pidl); } +static void test_printers_folder(void) +{ + IShellFolder2 *folder; + IPersistFolder2 *pf; + SHELLDETAILS details; + SHCOLSTATEF state; + LPITEMIDLIST pidl1, pidl2; + HRESULT hr; + INT i; + + CoInitialize( NULL ); + + hr = CoCreateInstance(&CLSID_Printers, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder2, (void**)&folder); + if (hr != S_OK) + { + win_skip("Failed to created IShellFolder2 for Printers folder\n"); + CoUninitialize(); + return; + } + +if (0) +{ + /* crashes on XP */ + hr = IShellFolder2_GetDetailsOf(folder, NULL, 0, NULL); + hr = IShellFolder2_GetDefaultColumnState(folder, 0, NULL); + hr = IPersistFolder2_GetCurFolder(pf, NULL); +} + + /* 5 columns defined */ + hr = IShellFolder2_GetDetailsOf(folder, NULL, 6, &details); + ok(hr == E_NOTIMPL, "got 0x%08x\n", hr); + + hr = IShellFolder2_GetDefaultColumnState(folder, 6, &state); + ok(broken(hr == E_NOTIMPL) || hr == E_INVALIDARG /* Win7 */, "got 0x%08x\n", hr); + + hr = IShellFolder2_GetDetailsOf(folder, NULL, 0, &details); + ok(hr == S_OK || broken(E_NOTIMPL) /* W2K */, "got 0x%08x\n", hr); + /* test every column if method is implemented */ + if (hr == S_OK) + { + ok(details.str.uType == STRRET_WSTR, "got %d\n", details.str.uType); + + for(i = 0; i < 6; i++) + { + hr = IShellFolder2_GetDetailsOf(folder, NULL, i, &details); + ok(hr == S_OK, "got 0x%08x\n", hr); + + /* all columns are left-aligned */ + ok(details.fmt == LVCFMT_LEFT, "got 0x%x\n", details.fmt); + /* can't be on w9x at this point, IShellFolder2 unsupported there, + check present for running Wine with w9x setup */ + if (SHELL_OsIsUnicode()) SHFree(details.str.u.pOleStr); + + hr = IShellFolder2_GetDefaultColumnState(folder, i, &state); + ok(hr == S_OK, "got 0x%08x\n", hr); + /* all columns are string except document count */ + if (i == 1) + ok(state == (SHCOLSTATE_TYPE_INT | SHCOLSTATE_ONBYDEFAULT), "got 0x%x\n", state); + else + ok(state == (SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT), "got 0x%x\n", state); + } + } + + /* default pidl */ + hr = IShellFolder2_QueryInterface(folder, &IID_IPersistFolder2, (void**)&pf); + ok(hr == S_OK, "got 0x%08x\n", hr); + + /* not initialized */ + pidl1 = (void*)0xdeadbeef; + hr = IPersistFolder2_GetCurFolder(pf, &pidl1); + ok(hr == S_FALSE, "got 0x%08x\n", hr); + ok(pidl1 == NULL, "got %p\n", pidl1); + + hr = SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &pidl2); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IPersistFolder2_Initialize(pf, pidl2); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IPersistFolder2_GetCurFolder(pf, &pidl1); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ok(ILIsEqual(pidl1, pidl2), "expected same PIDL\n"); + IPersistFolder2_Release(pf); + + ILFree(pidl1); + ILFree(pidl2); + IShellFolder2_Release(folder); + + CoUninitialize(); +} START_TEST(shfldr_special) { test_parse_for_entire_network(); test_parse_for_control_panel(); + test_printers_folder(); } diff --git a/rostests/winetests/shell32/shlexec.c b/rostests/winetests/shell32/shlexec.c index 5d5db34d2b4..b883d0bcbf9 100755 --- a/rostests/winetests/shell32/shlexec.c +++ b/rostests/winetests/shell32/shlexec.c @@ -797,6 +797,10 @@ static const char* testfiles[]= "%s\\test file.sde", "%s\\test file.exe", "%s\\test2.exe", + "%s\\simple.shlexec", + "%s\\drawback_file.noassoc", + "%s\\drawback_file.noassoc foo.shlexec", + "%s\\drawback_nonexist.noassoc foo.shlexec", NULL }; @@ -852,6 +856,239 @@ static filename_tests_t noquotes_tests[]= {NULL, NULL, 0} }; +static void test_lpFile_parsed(void) +{ + /* basename tmpdir */ + const char* shorttmpdir; + + const char *testfile; + char fileA[MAX_PATH]; + + int rc; + + GetTempPathA(sizeof(fileA), fileA); + shorttmpdir = tmpdir + strlen(fileA); + + /* ensure tmpdir is in %TEMP%: GetTempPath() can succeed even if TEMP is undefined */ + SetEnvironmentVariableA("TEMP", fileA); + + /* existing "drawback_file.noassoc" prevents finding "drawback_file.noassoc foo.shlexec" on wine */ + testfile = "%s\\drawback_file.noassoc foo.shlexec"; + sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + } + + /* if quoted, existing "drawback_file.noassoc" not prevents finding "drawback_file.noassoc foo.shlexec" on wine */ + testfile = "\"%s\\drawback_file.noassoc foo.shlexec\""; + sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + ok(rc>32 || broken(rc == 2) /* Win95/NT4 */, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + + /* error should be 2, not 31 */ + testfile = "\"%s\\drawback_file.noassoc\" foo.shlexec"; + sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + ok(rc==2, + "expected failure (2), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + + /* ""command"" not works on wine (and real win9x and w2k) */ + testfile = "\"\"%s\\simple.shlexec\"\""; + sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { + ok(rc>32 || broken(rc == 2) /* Win9x/2000 */, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + } + + /* nonexisting "drawback_nonexist.noassoc" not prevents finding "drawback_nonexist.noassoc foo.shlexec" on wine */ + testfile = "%s\\drawback_nonexist.noassoc foo.shlexec"; + sprintf(fileA, testfile, tmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + + /* is SEE_MASK_DOENVSUBST default flag? Should only be when XP emulates 9x (XP bug or real 95 or ME behavior ?) */ + testfile = "%%TEMP%%\\%s\\simple.shlexec"; + sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { + ok(rc==2, + "expected failure (2), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + } + + /* quoted */ + testfile = "\"%%TEMP%%\\%s\\simple.shlexec\""; + sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute(NULL, fileA, NULL, NULL); + todo_wine { + ok(rc==2, + "expected failure (2), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + } + + /* test SEE_MASK_DOENVSUBST works */ + testfile = "%%TEMP%%\\%s\\simple.shlexec"; + sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, NULL, fileA, NULL, NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + + /* quoted lpFile not works only on real win95 and nt4 */ + testfile = "\"%%TEMP%%\\%s\\simple.shlexec\""; + sprintf(fileA, testfile, shorttmpdir); + rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, NULL, fileA, NULL, NULL); + ok(rc>32 || broken(rc == 2) /* Win95/NT4 */, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + +} + +static void test_argify(void) +{ + char fileA[MAX_PATH]; + + int rc; + + sprintf(fileA, "%s\\test file.shlexec", tmpdir); + + /* %2 */ + rc=shell_execute("NoQuotesParam2", fileA, "a b", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + okChildInt("argcA", 5); + okChildString("argvA4", "a"); + } + + /* %2 */ + /* '"a"""' -> 'a"' */ + rc=shell_execute("NoQuotesParam2", fileA, "\"a:\"\"some string\"\"\"", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + okChildInt("argcA", 5); + todo_wine { + okChildString("argvA4", "a:some string"); + } + } + + /* %2 */ + /* backslash isn't escape char + * '"a\""' -> '"a\""' */ + rc=shell_execute("NoQuotesParam2", fileA, "\"a:\\\"some string\\\"\"", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + okChildInt("argcA", 5); + todo_wine { + okChildString("argvA4", "a:\\"); + } + } + + /* "%2" */ + /* \t isn't whitespace */ + rc=shell_execute("QuotedParam2", fileA, "a\tb c", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + okChildInt("argcA", 5); + todo_wine { + okChildString("argvA4", "a\tb"); + } + } + + /* %* */ + rc=shell_execute("NoQuotesAllParams", fileA, "a b c d e f g h", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + todo_wine { + okChildInt("argcA", 12); + okChildString("argvA4", "a"); + okChildString("argvA11", "h"); + } + } + + /* %* can sometimes contain only whitespaces and no args */ + rc=shell_execute("QuotedAllParams", fileA, " ", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + todo_wine { + okChildInt("argcA", 5); + okChildString("argvA4", " "); + } + } + + /* %~3 */ + rc=shell_execute("NoQuotesParams345etc", fileA, "a b c d e f g h", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + todo_wine { + okChildInt("argcA", 11); + okChildString("argvA4", "b"); + okChildString("argvA10", "h"); + } + } + + /* %~3 is rest of command line starting with whitespaces after 2nd arg */ + rc=shell_execute("QuotedParams345etc", fileA, "a ", NULL); + ok(rc>32, + "expected success (33), got %s (%d), lpFile: %s\n", + rc > 32 ? "success" : "failure", rc, fileA + ); + if (rc>32) + { + okChildInt("argcA", 5); + todo_wine { + okChildString("argvA4", " "); + } + } + +} + static void test_filename(void) { char filename[MAX_PATH]; @@ -1744,7 +1981,7 @@ static void init_test(void) } r = CoInitialize(NULL); - ok(SUCCEEDED(r), "CoInitialize failed (0x%08x)\n", r); + ok(r == S_OK, "CoInitialize failed (0x%08x)\n", r); if (FAILED(r)) exit(1); @@ -1825,6 +2062,15 @@ static void init_test(void) create_test_verb(".shlexec", "QuotedLowerL", 0, "QuotedLowerL \"%l\""); create_test_verb(".shlexec", "UpperL", 0, "UpperL %L"); create_test_verb(".shlexec", "QuotedUpperL", 0, "QuotedUpperL \"%L\""); + + create_test_verb(".shlexec", "NoQuotesParam2", 0, "NoQuotesParam2 %2"); + create_test_verb(".shlexec", "QuotedParam2", 0, "QuotedParam2 \"%2\""); + + create_test_verb(".shlexec", "NoQuotesAllParams", 0, "NoQuotesAllParams %*"); + create_test_verb(".shlexec", "QuotedAllParams", 0, "QuotedAllParams \"%*\""); + + create_test_verb(".shlexec", "NoQuotesParams345etc", 0, "NoQuotesParams345etc %~3"); + create_test_verb(".shlexec", "QuotedParams345etc", 0, "QuotedParams345etc \"%~3\""); } static void cleanup_test(void) @@ -1938,6 +2184,8 @@ START_TEST(shlexec) init_test(); + test_argify(); + test_lpFile_parsed(); test_filename(); test_find_executable(); test_lnks(); diff --git a/rostests/winetests/shell32/shlfolder.c b/rostests/winetests/shell32/shlfolder.c index bce7c3ebe44..085c91e064e 100644 --- a/rostests/winetests/shell32/shlfolder.c +++ b/rostests/winetests/shell32/shlfolder.c @@ -60,6 +60,7 @@ static void init_function_pointers(void) { HMODULE hmod; HRESULT hr; + void *ptr; hmod = GetModuleHandleA("shell32.dll"); @@ -81,6 +82,33 @@ static void init_function_pointers(void) MAKEFUNC_ORD(ILFree, 155); #undef MAKEFUNC_ORD + /* test named exports */ + ptr = GetProcAddress(hmod, "ILFree"); + ok(broken(ptr == 0) || ptr != 0, "expected named export for ILFree\n"); + if (ptr) + { +#define TESTNAMED(f) \ + ptr = (void*)GetProcAddress(hmod, #f); \ + ok(ptr != 0, "expected named export for " #f "\n"); + + TESTNAMED(ILAppendID); + TESTNAMED(ILClone); + TESTNAMED(ILCloneFirst); + TESTNAMED(ILCombine); + TESTNAMED(ILCreateFromPath); + TESTNAMED(ILCreateFromPathA); + TESTNAMED(ILCreateFromPathW); + TESTNAMED(ILFindChild); + TESTNAMED(ILFindLastID); + TESTNAMED(ILGetNext); + TESTNAMED(ILGetSize); + TESTNAMED(ILIsEqual); + TESTNAMED(ILIsParent); + TESTNAMED(ILRemoveLastID); + TESTNAMED(ILSaveToStream); +#undef TESTNAMED + } + hmod = GetModuleHandleA("shlwapi.dll"); pStrRetToBufW = (void*)GetProcAddress(hmod, "StrRetToBufW"); @@ -102,6 +130,7 @@ static void test_ParseDisplayName(void) BOOL bRes; hr = SHGetDesktopFolder(&IDesktopFolder); + ok(hr == S_OK, "Expected SHGetDesktopFolder to return S_OK, got 0x%08x\n", hr); if(hr != S_OK) return; /* Tests crash on W2K and below (SHCreateShellItem available as of XP) */ @@ -125,9 +154,9 @@ static void test_ParseDisplayName(void) MultiByteToWideChar(CP_ACP, 0, cInetTestA, -1, cTestDirW, MAX_PATH); hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cTestDirW, NULL, &newPIDL, 0); - todo_wine ok((SUCCEEDED(hr) || broken(hr == E_FAIL) /* NT4 */), + todo_wine ok(hr == S_OK || broken(hr == E_FAIL) /* NT4 */, "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL\n", hr); - if (SUCCEEDED(hr)) + if (hr == S_OK) { ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x61, "Last pidl should be of type " "PT_IESPECIAL1, but is: %02x\n", pILFindLastID(newPIDL)->mkid.abID[0]); @@ -137,9 +166,9 @@ static void test_ParseDisplayName(void) MultiByteToWideChar(CP_ACP, 0, cInetTest2A, -1, cTestDirW, MAX_PATH); hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cTestDirW, NULL, &newPIDL, 0); - todo_wine ok((SUCCEEDED(hr) || broken(hr == E_FAIL) /* NT4 */), + todo_wine ok(hr == S_OK || broken(hr == E_FAIL) /* NT4 */, "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL\n", hr); - if (SUCCEEDED(hr)) + if (hr == S_OK) { ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x61, "Last pidl should be of type " "PT_IESPECIAL1, but is: %02x\n", pILFindLastID(newPIDL)->mkid.abID[0]); @@ -147,7 +176,11 @@ static void test_ParseDisplayName(void) } res = GetFileAttributesA(cNonExistDir1A); - if(res != INVALID_FILE_ATTRIBUTES) return; + if(res != INVALID_FILE_ATTRIBUTES) + { + skip("Test directory unexpectedly exists\n"); + goto finished; + } MultiByteToWideChar(CP_ACP, 0, cNonExistDir1A, -1, cTestDirW, MAX_PATH); hr = IShellFolder_ParseDisplayName(IDesktopFolder, @@ -156,7 +189,11 @@ static void test_ParseDisplayName(void) "ParseDisplayName returned %08x, expected 80070002 or E_FAIL\n", hr); res = GetFileAttributesA(cNonExistDir2A); - if(res != INVALID_FILE_ATTRIBUTES) return; + if(res != INVALID_FILE_ATTRIBUTES) + { + skip("Test directory unexpectedly exists\n"); + goto finished; + } MultiByteToWideChar(CP_ACP, 0, cNonExistDir2A, -1, cTestDirW, MAX_PATH); hr = IShellFolder_ParseDisplayName(IDesktopFolder, @@ -167,15 +204,19 @@ static void test_ParseDisplayName(void) /* I thought that perhaps the DesktopFolder's ParseDisplayName would recognize the * path corresponding to CSIDL_PERSONAL and return a CLSID_MyDocuments PIDL. Turns * out it doesn't. The magic seems to happen in the file dialogs, then. */ - if (!pSHGetSpecialFolderPathW || !pILFindLastID) goto finished; - + if (!pSHGetSpecialFolderPathW || !pILFindLastID) + { + win_skip("SHGetSpecialFolderPathW and/or ILFindLastID are not available\n"); + goto finished; + } + bRes = pSHGetSpecialFolderPathW(NULL, cTestDirW, CSIDL_PERSONAL, FALSE); ok(bRes, "SHGetSpecialFolderPath(CSIDL_PERSONAL) failed! %u\n", GetLastError()); if (!bRes) goto finished; hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cTestDirW, NULL, &newPIDL, 0); - ok(SUCCEEDED(hr), "DesktopFolder->ParseDisplayName failed. hr = %08x.\n", hr); - if (FAILED(hr)) goto finished; + ok(hr == S_OK, "DesktopFolder->ParseDisplayName failed. hr = %08x.\n", hr); + if (hr != S_OK) goto finished; ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x31 || pILFindLastID(newPIDL)->mkid.abID[0] == 0xb1, /* Win98 */ @@ -331,8 +372,8 @@ static void test_BindToObject(void) * with an empty pidl. This is tested for Desktop, MyComputer and the FS ShellFolder */ hr = SHGetDesktopFolder(&psfDesktop); - ok (SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "SHGetDesktopFolder failed! hr = %08x\n", hr); + if (hr != S_OK) return; hr = IShellFolder_BindToObject(psfDesktop, pidlEmpty, NULL, &IID_IShellFolder, (LPVOID*)&psfChild); ok (hr == E_INVALIDARG, "Desktop's BindToObject should fail, when called with empty pidl! hr = %08x\n", hr); @@ -341,17 +382,17 @@ static void test_BindToObject(void) ok (hr == E_INVALIDARG, "Desktop's BindToObject should fail, when called with NULL pidl! hr = %08x\n", hr); hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszMyComputer, NULL, &pidlMyComputer, NULL); - ok (SUCCEEDED(hr), "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } hr = IShellFolder_BindToObject(psfDesktop, pidlMyComputer, NULL, &IID_IShellFolder, (LPVOID*)&psfMyComputer); - ok (SUCCEEDED(hr), "Desktop failed to bind to MyComputer object! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop failed to bind to MyComputer object! hr = %08x\n", hr); IShellFolder_Release(psfDesktop); IMalloc_Free(ppM, pidlMyComputer); - if (FAILED(hr)) return; + if (hr != S_OK) return; hr = IShellFolder_BindToObject(psfMyComputer, pidlEmpty, NULL, &IID_IShellFolder, (LPVOID*)&psfChild); ok (hr == E_INVALIDARG, "MyComputers's BindToObject should fail, when called with empty pidl! hr = %08x\n", hr); @@ -372,17 +413,17 @@ if (0) MultiByteToWideChar(CP_ACP, 0, szSystemDir, -1, wszSystemDir, MAX_PATH); hr = IShellFolder_ParseDisplayName(psfMyComputer, NULL, NULL, wszSystemDir, NULL, &pidlSystemDir, NULL); - ok (SUCCEEDED(hr), "MyComputers's ParseDisplayName failed to parse the SystemDirectory! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "MyComputers's ParseDisplayName failed to parse the SystemDirectory! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfMyComputer); return; } hr = IShellFolder_BindToObject(psfMyComputer, pidlSystemDir, NULL, &IID_IShellFolder, (LPVOID*)&psfSystemDir); - ok (SUCCEEDED(hr), "MyComputer failed to bind to a FileSystem ShellFolder! hr = %08x\n", hr); + ok (hr == S_OK, "MyComputer failed to bind to a FileSystem ShellFolder! hr = %08x\n", hr); IShellFolder_Release(psfMyComputer); IMalloc_Free(ppM, pidlSystemDir); - if (FAILED(hr)) return; + if (hr != S_OK) return; hr = IShellFolder_BindToObject(psfSystemDir, pidlEmpty, NULL, &IID_IShellFolder, (LPVOID*)&psfChild); ok (hr == E_INVALIDARG, @@ -475,14 +516,14 @@ static void test_GetDisplayName(void) /* Getting an itemidlist for the file. */ hr = SHGetDesktopFolder(&psfDesktop); - ok(SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "SHGetDesktopFolder failed! hr = %08x\n", hr); + if (hr != S_OK) return; MultiByteToWideChar(CP_ACP, 0, szTestFile, -1, wszTestFile, MAX_PATH); hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszTestFile, NULL, &pidlTestFile, NULL); - ok(SUCCEEDED(hr), "Desktop->ParseDisplayName failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok(hr == S_OK, "Desktop->ParseDisplayName failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } @@ -510,9 +551,9 @@ static void test_GetDisplayName(void) todo_wine ok (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || hr == E_NOTIMPL || /* Vista */ - broken(SUCCEEDED(hr)), /* Win9x, W2K */ + broken(hr == S_OK), /* Win9x, W2K */ "hr = %08x\n", hr); - if (SUCCEEDED(hr)) { + if (hr == S_OK) { IShellFolder_Release(psfFile); } @@ -528,15 +569,15 @@ static void test_GetDisplayName(void) if (pSHGetFolderPathAndSubDirA) { hr = pSHBindToParent(pidlTestFile, &IID_IShellFolder, (VOID**)&psfPersonal, &pidlLast); - ok(SUCCEEDED(hr), "SHBindToParent failed! hr = %08x\n", hr); - if (SUCCEEDED(hr)) { + ok(hr == S_OK, "SHBindToParent failed! hr = %08x\n", hr); + if (hr == S_OK) { /* It's ok to use this fixed path. Call will fail anyway. */ WCHAR wszAbsoluteFilename[] = { 'C',':','\\','w','i','n','e','t','e','s','t', 0 }; LPITEMIDLIST pidlNew; /* The pidl returned through the last parameter of SetNameOf is a simple one. */ hr = IShellFolder_SetNameOf(psfPersonal, NULL, pidlLast, wszDirName, SHGDN_NORMAL, &pidlNew); - ok (SUCCEEDED(hr), "SetNameOf failed! hr = %08x\n", hr); + ok (hr == S_OK, "SetNameOf failed! hr = %08x\n", hr); if (hr == S_OK) { ok (((LPITEMIDLIST)((LPBYTE)pidlNew+pidlNew->mkid.cb))->mkid.cb == 0, @@ -551,7 +592,7 @@ static void test_GetDisplayName(void) /* Rename the file back to its original name. SetNameOf ignores the fact, that the * SHGDN flags specify an absolute path. */ hr = IShellFolder_SetNameOf(psfPersonal, NULL, pidlNew, wszFileName, SHGDN_FORPARSING, NULL); - ok (SUCCEEDED(hr), "SetNameOf failed! hr = %08x\n", hr); + ok (hr == S_OK, "SetNameOf failed! hr = %08x\n", hr); pILFree(pidlNew); } @@ -576,19 +617,19 @@ static void test_GetDisplayName(void) /* SHBindToParent fails, if called with a NULL PIDL. */ hr = pSHBindToParent(NULL, &IID_IShellFolder, (VOID**)&psfPersonal, &pidlLast); - ok (FAILED(hr), "SHBindToParent(NULL) should fail!\n"); + ok (hr != S_OK, "SHBindToParent(NULL) should fail!\n"); /* But it succeeds with an empty PIDL. */ hr = pSHBindToParent(pidlEmpty, &IID_IShellFolder, (VOID**)&psfPersonal, &pidlLast); - ok (SUCCEEDED(hr), "SHBindToParent(empty PIDL) should succeed! hr = %08x\n", hr); + ok (hr == S_OK, "SHBindToParent(empty PIDL) should succeed! hr = %08x\n", hr); ok (pidlLast == pidlEmpty, "The last element of an empty PIDL should be the PIDL itself!\n"); - if (SUCCEEDED(hr)) + if (hr == S_OK) IShellFolder_Release(psfPersonal); /* Binding to the folder and querying the display name of the file also works. */ hr = pSHBindToParent(pidlTestFile, &IID_IShellFolder, (VOID**)&psfPersonal, &pidlLast); - ok (SUCCEEDED(hr), "SHBindToParent failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "SHBindToParent failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } @@ -599,8 +640,8 @@ static void test_GetDisplayName(void) "SHBindToParent doesn't return the last id of the pidl param!\n"); hr = IShellFolder_GetDisplayNameOf(psfPersonal, pidlLast, SHGDN_FORPARSING, &strret); - ok (SUCCEEDED(hr), "Personal->GetDisplayNameOf failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "Personal->GetDisplayNameOf failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); IShellFolder_Release(psfPersonal); return; @@ -609,7 +650,7 @@ static void test_GetDisplayName(void) if (pStrRetToBufW) { hr = pStrRetToBufW(&strret, pidlLast, wszTestFile2, MAX_PATH); - ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + ok (hr == S_OK, "StrRetToBufW failed! hr = %08x\n", hr); ok (!lstrcmpiW(wszTestFile, wszTestFile2), "GetDisplayNameOf returns incorrect path!\n"); } @@ -648,15 +689,15 @@ static void test_CallForAttributes(void) * on MSDN. This test is meant to document the observed behaviour on WinXP SP2. */ hr = SHGetDesktopFolder(&psfDesktop); - ok (SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "SHGetDesktopFolder failed! hr = %08x\n", hr); + if (hr != S_OK) return; hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszMyDocuments, NULL, &pidlMyDocuments, NULL); - ok (SUCCEEDED(hr) || + ok (hr == S_OK || broken(hr == E_INVALIDARG), /* Win95, NT4 */ "Desktop's ParseDisplayName failed to parse MyDocuments's CLSID! hr = %08x\n", hr); - if (FAILED(hr)) { + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } @@ -664,7 +705,7 @@ static void test_CallForAttributes(void) dwAttributes = 0xffffffff; hr = IShellFolder_GetAttributesOf(psfDesktop, 1, (LPCITEMIDLIST*)&pidlMyDocuments, &dwAttributes); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf(MyDocuments) failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop->GetAttributesOf(MyDocuments) failed! hr = %08x\n", hr); /* We need the following setup (as observed on WinXP SP2), for the tests to make sense. */ ok (dwAttributes & SFGAO_FILESYSTEM, "SFGAO_FILESYSTEM attribute is not set for MyDocuments!\n"); @@ -726,8 +767,8 @@ static void test_CallForAttributes(void) dwAttributes = SFGAO_ISSLOW|SFGAO_GHOSTED|SFGAO_FILESYSTEM; hr = IShellFolder_GetAttributesOf(psfDesktop, 1, (LPCITEMIDLIST*)&pidlMyDocuments, &dwAttributes); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf(MyDocuments) failed! hr = %08x\n", hr); - if (SUCCEEDED(hr)) + ok (hr == S_OK, "Desktop->GetAttributesOf(MyDocuments) failed! hr = %08x\n", hr); + if (hr == S_OK) ok (dwAttributes == SFGAO_FILESYSTEM, "Desktop->GetAttributes(MyDocuments) returned unexpected attributes: %08x\n", dwAttributes); @@ -786,13 +827,13 @@ static void test_GetAttributesOf(void) BOOL foundFlagsMatch; hr = SHGetDesktopFolder(&psfDesktop); - ok (SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "SHGetDesktopFolder failed! hr = %08x\n", hr); + if (hr != S_OK) return; /* The Desktop attributes can be queried with a single empty itemidlist, .. */ dwFlags = 0xffffffff; hr = IShellFolder_GetAttributesOf(psfDesktop, 1, &pidlEmpty, &dwFlags); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf(empty pidl) failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop->GetAttributesOf(empty pidl) failed! hr = %08x\n", hr); for (i = 0, foundFlagsMatch = FALSE; !foundFlagsMatch && i < sizeof(desktopFlags) / sizeof(desktopFlags[0]); i++) { @@ -804,7 +845,7 @@ static void test_GetAttributesOf(void) /* .. or with no itemidlist at all. */ dwFlags = 0xffffffff; hr = IShellFolder_GetAttributesOf(psfDesktop, 0, NULL, &dwFlags); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf(NULL) failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop->GetAttributesOf(NULL) failed! hr = %08x\n", hr); for (i = 0, foundFlagsMatch = FALSE; !foundFlagsMatch && i < sizeof(desktopFlags) / sizeof(desktopFlags[0]); i++) { @@ -815,8 +856,8 @@ static void test_GetAttributesOf(void) /* Testing the attributes of the MyComputer shellfolder */ hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszMyComputer, NULL, &pidlMyComputer, NULL); - ok (SUCCEEDED(hr), "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } @@ -826,7 +867,7 @@ static void test_GetAttributesOf(void) */ dwFlags = 0xffffffff; hr = IShellFolder_GetAttributesOf(psfDesktop, 1, (LPCITEMIDLIST*)&pidlMyComputer, &dwFlags); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf(MyComputer) failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop->GetAttributesOf(MyComputer) failed! hr = %08x\n", hr); for (i = 0, foundFlagsMatch = FALSE; !foundFlagsMatch && i < sizeof(myComputerFlags) / sizeof(myComputerFlags[0]); i++) { @@ -837,20 +878,20 @@ static void test_GetAttributesOf(void) ok (foundFlagsMatch, "Wrong MyComputer attributes: %08x\n", dwFlags); hr = IShellFolder_BindToObject(psfDesktop, pidlMyComputer, NULL, &IID_IShellFolder, (LPVOID*)&psfMyComputer); - ok (SUCCEEDED(hr), "Desktop failed to bind to MyComputer object! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop failed to bind to MyComputer object! hr = %08x\n", hr); IShellFolder_Release(psfDesktop); IMalloc_Free(ppM, pidlMyComputer); - if (FAILED(hr)) return; + if (hr != S_OK) return; hr = IShellFolder_GetAttributesOf(psfMyComputer, 1, &pidlEmpty, &dwFlags); todo_wine ok (hr == E_INVALIDARG || - broken(SUCCEEDED(hr)), /* W2K and earlier */ + broken(hr == S_OK), /* W2K and earlier */ "MyComputer->GetAttributesOf(emtpy pidl) should fail! hr = %08x\n", hr); dwFlags = 0xffffffff; hr = IShellFolder_GetAttributesOf(psfMyComputer, 0, NULL, &dwFlags); - ok (SUCCEEDED(hr), "MyComputer->GetAttributesOf(NULL) failed! hr = %08x\n", hr); + ok (hr == S_OK, "MyComputer->GetAttributesOf(NULL) failed! hr = %08x\n", hr); for (i = 0, foundFlagsMatch = FALSE; !foundFlagsMatch && i < sizeof(myComputerFlags) / sizeof(myComputerFlags[0]); i++) { @@ -895,7 +936,7 @@ static void test_GetAttributesOf(void) /* test the shell attributes of the test directory using the relative PIDL */ dwFlags = SFGAO_FOLDER; hr = IShellFolder_GetAttributesOf(testIShellFolder, 1, (LPCITEMIDLIST*)&newPIDL, &dwFlags); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf() failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop->GetAttributesOf() failed! hr = %08x\n", hr); ok ((dwFlags&SFGAO_FOLDER), "Wrong directory attribute for relative PIDL: %08x\n", dwFlags); /* free memory */ @@ -913,7 +954,7 @@ static void test_GetAttributesOf(void) /* test the shell attributes of the test directory using the absolute PIDL */ dwFlags = SFGAO_FOLDER; hr = IShellFolder_GetAttributesOf(IDesktopFolder, 1, (LPCITEMIDLIST*)&newPIDL, &dwFlags); - ok (SUCCEEDED(hr), "Desktop->GetAttributesOf() failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop->GetAttributesOf() failed! hr = %08x\n", hr); ok ((dwFlags&SFGAO_FOLDER), "Wrong directory attribute for absolute PIDL: %08x\n", dwFlags); /* free memory */ @@ -982,12 +1023,12 @@ static void test_SHGetPathFromIDList(void) /* MyComputer does not map to a filesystem path. SHGetPathFromIDListW should fail. */ hr = SHGetDesktopFolder(&psfDesktop); - ok (SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "SHGetDesktopFolder failed! hr = %08x\n", hr); + if (hr != S_OK) return; hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszMyComputer, NULL, &pidlMyComputer, NULL); - ok (SUCCEEDED(hr), "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } @@ -1025,8 +1066,8 @@ static void test_SHGetPathFromIDList(void) CloseHandle(hTestFile); hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszTestFile, NULL, &pidlTestFile, NULL); - ok (SUCCEEDED(hr), "Desktop's ParseDisplayName failed to parse filename hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "Desktop's ParseDisplayName failed to parse filename hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); DeleteFileW(wszFileName); IMalloc_Free(ppM, pidlTestFile); @@ -1036,10 +1077,10 @@ static void test_SHGetPathFromIDList(void) /* This test is to show that the Desktop shellfolder prepends the CSIDL_DESKTOPDIRECTORY * path for files placed on the desktop, if called with SHGDN_FORPARSING. */ hr = IShellFolder_GetDisplayNameOf(psfDesktop, pidlTestFile, SHGDN_FORPARSING, &strret); - ok (SUCCEEDED(hr), "Desktop's GetDisplayNamfOf failed! hr = %08x\n", hr); + ok (hr == S_OK, "Desktop's GetDisplayNamfOf failed! hr = %08x\n", hr); IShellFolder_Release(psfDesktop); DeleteFileW(wszFileName); - if (FAILED(hr)) { + if (hr != S_OK) { IMalloc_Free(ppM, pidlTestFile); return; } @@ -1063,7 +1104,7 @@ static void test_SHGetPathFromIDList(void) pSHGetSpecialFolderLocation = (void *)GetProcAddress(hShell32, "SHGetSpecialFolderLocation"); hr = pSHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidlPrograms); - ok(SUCCEEDED(hr), "SHGetFolderLocation failed: 0x%08x\n", hr); + ok(hr == S_OK, "SHGetFolderLocation failed: 0x%08x\n", hr); SetLastError(0xdeadbeef); result = pSHGetPathFromIDListW(pidlPrograms, wszPath); @@ -1280,12 +1321,12 @@ static void test_FolderShortcut(void) { win_skip("CLSID_FolderShortcut is not implemented\n"); return; } - ok (SUCCEEDED(hr), "CoCreateInstance failed! hr = 0x%08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "CoCreateInstance failed! hr = 0x%08x\n", hr); + if (hr != S_OK) return; hr = IPersistPropertyBag_Load(pPersistPropertyBag, &InitPropertyBag, NULL); - ok(SUCCEEDED(hr), "IPersistPropertyBag_Load failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok(hr == S_OK, "IPersistPropertyBag_Load failed! hr = %08x\n", hr); + if (hr != S_OK) { IPersistPropertyBag_Release(pPersistPropertyBag); return; } @@ -1293,12 +1334,12 @@ static void test_FolderShortcut(void) { hr = IPersistPropertyBag_QueryInterface(pPersistPropertyBag, &IID_IShellFolder, (LPVOID*)&pShellFolder); IPersistPropertyBag_Release(pPersistPropertyBag); - ok(SUCCEEDED(hr), "IPersistPropertyBag_QueryInterface(IShellFolder) failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "IPersistPropertyBag_QueryInterface(IShellFolder) failed! hr = %08x\n", hr); + if (hr != S_OK) return; hr = IShellFolder_GetDisplayNameOf(pShellFolder, NULL, SHGDN_FORPARSING, &strret); - ok(SUCCEEDED(hr), "IShellFolder_GetDisplayNameOf(NULL) failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok(hr == S_OK, "IShellFolder_GetDisplayNameOf(NULL) failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(pShellFolder); return; } @@ -1312,15 +1353,15 @@ static void test_FolderShortcut(void) { hr = IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder3, (LPVOID*)&pPersistFolder3); IShellFolder_Release(pShellFolder); - ok(SUCCEEDED(hr), "IShellFolder_QueryInterface(IID_IPersistFolder3 failed! hr = 0x%08x\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "IShellFolder_QueryInterface(IID_IPersistFolder3 failed! hr = 0x%08x\n", hr); + if (hr != S_OK) return; hr = IPersistFolder3_GetClassID(pPersistFolder3, &clsid); - ok(SUCCEEDED(hr), "IPersistFolder3_GetClassID failed! hr=0x%08x\n", hr); + ok(hr == S_OK, "IPersistFolder3_GetClassID failed! hr=0x%08x\n", hr); ok(IsEqualCLSID(&clsid, &CLSID_FolderShortcut), "Unexpected CLSID!\n"); hr = IPersistFolder3_GetCurFolder(pPersistFolder3, &pidlCurrentFolder); - ok(SUCCEEDED(hr), "IPersistFolder3_GetCurFolder failed! hr=0x%08x\n", hr); + todo_wine ok(hr == S_FALSE, "IPersistFolder3_GetCurFolder failed! hr=0x%08x\n", hr); ok(!pidlCurrentFolder, "IPersistFolder3_GetCurFolder should return a NULL pidl!\n"); /* For FolderShortcut objects, the Initialize method initialized the folder's position in the @@ -1330,8 +1371,8 @@ static void test_FolderShortcut(void) { * itemidlist, but GetDisplayNameOf still returns the path from above. */ hr = SHGetDesktopFolder(&pDesktopFolder); - ok (SUCCEEDED(hr), "SHGetDesktopFolder failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "SHGetDesktopFolder failed! hr = %08x\n", hr); + if (hr != S_OK) return; /* Temporarily register WineTestFolder as a shell namespace extension at the Desktop. * Otherwise ParseDisplayName fails on WinXP with E_INVALIDARG */ @@ -1341,19 +1382,19 @@ static void test_FolderShortcut(void) { &pidlWineTestFolder, NULL); RegDeleteKeyW(HKEY_CURRENT_USER, wszShellExtKey); IShellFolder_Release(pDesktopFolder); - ok (SUCCEEDED(hr), "IShellFolder::ParseDisplayName failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok (hr == S_OK, "IShellFolder::ParseDisplayName failed! hr = %08x\n", hr); + if (hr != S_OK) return; hr = IPersistFolder3_Initialize(pPersistFolder3, pidlWineTestFolder); - ok (SUCCEEDED(hr), "IPersistFolder3::Initialize failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "IPersistFolder3::Initialize failed! hr = %08x\n", hr); + if (hr != S_OK) { IPersistFolder3_Release(pPersistFolder3); pILFree(pidlWineTestFolder); return; } hr = IPersistFolder3_GetCurFolder(pPersistFolder3, &pidlCurrentFolder); - ok(SUCCEEDED(hr), "IPersistFolder3_GetCurFolder failed! hr=0x%08x\n", hr); + ok(hr == S_OK, "IPersistFolder3_GetCurFolder failed! hr=0x%08x\n", hr); ok(pILIsEqual(pidlCurrentFolder, pidlWineTestFolder), "IPersistFolder3_GetCurFolder should return pidlWineTestFolder!\n"); pILFree(pidlCurrentFolder); @@ -1361,12 +1402,12 @@ static void test_FolderShortcut(void) { hr = IPersistFolder3_QueryInterface(pPersistFolder3, &IID_IShellFolder, (LPVOID*)&pShellFolder); IPersistFolder3_Release(pPersistFolder3); - ok(SUCCEEDED(hr), "IPersistFolder3_QueryInterface(IShellFolder) failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "IPersistFolder3_QueryInterface(IShellFolder) failed! hr = %08x\n", hr); + if (hr != S_OK) return; hr = IShellFolder_GetDisplayNameOf(pShellFolder, NULL, SHGDN_FORPARSING, &strret); - ok(SUCCEEDED(hr), "IShellFolder_GetDisplayNameOf(NULL) failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok(hr == S_OK, "IShellFolder_GetDisplayNameOf(NULL) failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(pShellFolder); return; } @@ -1386,8 +1427,8 @@ static void test_FolderShortcut(void) { hr = IShellFolder_ParseDisplayName(pShellFolder, NULL, NULL, wszSomeSubFolder, NULL, &pidlSubFolder, NULL); RemoveDirectoryW(wszDesktopPath); - ok (SUCCEEDED(hr), "IShellFolder::ParseDisplayName failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok (hr == S_OK, "IShellFolder::ParseDisplayName failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(pShellFolder); return; } @@ -1396,14 +1437,14 @@ static void test_FolderShortcut(void) { (LPVOID*)&pPersistFolder3); IShellFolder_Release(pShellFolder); pILFree(pidlSubFolder); - ok (SUCCEEDED(hr), "IShellFolder::BindToObject failed! hr = %08x\n", hr); - if (FAILED(hr)) + ok (hr == S_OK, "IShellFolder::BindToObject failed! hr = %08x\n", hr); + if (hr != S_OK) return; /* On windows, we expect CLSID_ShellFSFolder. On wine we relax this constraint * a little bit and also allow CLSID_UnixDosFolder. */ hr = IPersistFolder3_GetClassID(pPersistFolder3, &clsid); - ok(SUCCEEDED(hr), "IPersistFolder3_GetClassID failed! hr=0x%08x\n", hr); + ok(hr == S_OK, "IPersistFolder3_GetClassID failed! hr=0x%08x\n", hr); ok(IsEqualCLSID(&clsid, &CLSID_ShellFSFolder) || IsEqualCLSID(&clsid, &CLSID_UnixDosFolder), "IPersistFolder3::GetClassID returned unexpected CLSID!\n"); @@ -1463,12 +1504,12 @@ static void test_ITEMIDLIST_format(void) { if (!bResult) return; hr = SHGetDesktopFolder(&psfDesktop); - ok(SUCCEEDED(hr), "SHGetDesktopFolder failed! hr: %08x\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "SHGetDesktopFolder failed! hr: %08x\n", hr); + if (hr != S_OK) return; hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszPersonal, NULL, &pidlPersonal, NULL); - ok(SUCCEEDED(hr), "psfDesktop->ParseDisplayName failed! hr = %08x\n", hr); - if (FAILED(hr)) { + ok(hr == S_OK, "psfDesktop->ParseDisplayName failed! hr = %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfDesktop); return; } @@ -1477,8 +1518,8 @@ static void test_ITEMIDLIST_format(void) { (LPVOID*)&psfPersonal); IShellFolder_Release(psfDesktop); pILFree(pidlPersonal); - ok(SUCCEEDED(hr), "psfDesktop->BindToObject failed! hr = %08x\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "psfDesktop->BindToObject failed! hr = %08x\n", hr); + if (hr != S_OK) return; for (i=0; i<3; i++) { CHAR szFile[MAX_PATH]; @@ -1497,8 +1538,8 @@ static void test_ITEMIDLIST_format(void) { hr = IShellFolder_ParseDisplayName(psfPersonal, NULL, NULL, wszFile[i], NULL, &pidlFile, NULL); DeleteFileW(wszFile[i]); - ok(SUCCEEDED(hr), "psfPersonal->ParseDisplayName failed! hr: %08x\n", hr); - if (FAILED(hr)) { + ok(hr == S_OK, "psfPersonal->ParseDisplayName failed! hr: %08x\n", hr); + if (hr != S_OK) { IShellFolder_Release(psfPersonal); return; } @@ -1771,10 +1812,10 @@ static void test_LocalizedNames(void) hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER, &strret); ok(hr == S_OK, "GetDisplayNameOf failed %08x\n", hr); - if (SUCCEEDED(hr) && pStrRetToBufW) + if (hr == S_OK && pStrRetToBufW) { hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR)); - ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + ok (hr == S_OK, "StrRetToBufW failed! hr = %08x\n", hr); todo_wine ok (!lstrcmpiW(tempbufW, folderdisplayW) || broken(!lstrcmpiW(tempbufW, foldernameW)), /* W2K */ @@ -1785,10 +1826,10 @@ static void test_LocalizedNames(void) hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER|SHGDN_FOREDITING, &strret); ok(hr == S_OK, "GetDisplayNameOf failed %08x\n", hr); - if (SUCCEEDED(hr) && pStrRetToBufW) + if (hr == S_OK && pStrRetToBufW) { hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR)); - ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + ok (hr == S_OK, "StrRetToBufW failed! hr = %08x\n", hr); todo_wine ok (!lstrcmpiW(tempbufW, folderdisplayW) || broken(!lstrcmpiW(tempbufW, foldernameW)), /* W2K */ @@ -1799,10 +1840,10 @@ static void test_LocalizedNames(void) hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER|SHGDN_FORPARSING, &strret); ok(hr == S_OK, "GetDisplayNameOf failed %08x\n", hr); - if (SUCCEEDED(hr) && pStrRetToBufW) + if (hr == S_OK && pStrRetToBufW) { hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR)); - ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + ok (hr == S_OK, "StrRetToBufW failed! hr = %08x\n", hr); ok (!lstrcmpiW(tempbufW, foldernameW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW)); } @@ -1983,7 +2024,6 @@ static void test_SHCreateShellItem(void) static void test_SHParseDisplayName(void) { - static const WCHAR prefixW[] = {'w','t',0}; LPITEMIDLIST pidl1, pidl2; IShellFolder *desktop; WCHAR dirW[MAX_PATH]; @@ -2025,9 +2065,7 @@ if (0) pILFree(pidl2); /* with path */ - GetTempPathW(sizeof(dirW)/sizeof(WCHAR), dirW); - GetTempFileNameW(dirW, prefixW, 0, dirW); - CreateFileW(dirW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + GetWindowsDirectoryW( dirW, MAX_PATH ); hr = pSHParseDisplayName(dirW, NULL, &pidl1, 0, NULL); ok(hr == S_OK, "failed %08x\n", hr); @@ -2039,7 +2077,35 @@ if (0) pILFree(pidl1); pILFree(pidl2); - DeleteFileW(dirW); + IShellFolder_Release(desktop); +} + +static void test_desktop_IPersist(void) +{ + IShellFolder *desktop; + IPersist *persist; + CLSID clsid; + HRESULT hr; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "failed %08x\n", hr); + + hr = IShellFolder_QueryInterface(desktop, &IID_IPersist, (void**)&persist); + ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* NT4, W9X */, "failed %08x\n", hr); + + if (hr == S_OK) + { + if (0) + { + /* crashes on native */ + hr = IPersist_GetClassID(persist, NULL); + } + memset(&clsid, 0, sizeof(clsid)); + hr = IPersist_GetClassID(persist, &clsid); + ok(hr == S_OK, "failed %08x\n", hr); + ok(IsEqualIID(&CLSID_ShellDesktop, &clsid), "Expected CLSID_ShellDesktop\n"); + IPersist_Release(persist); + } IShellFolder_Release(desktop); } @@ -2064,6 +2130,7 @@ START_TEST(shlfolder) test_SHGetFolderPathAndSubDirA(); test_LocalizedNames(); test_SHCreateShellItem(); + test_desktop_IPersist(); OleUninitialize(); } diff --git a/rostests/winetests/shell32/shlview.c b/rostests/winetests/shell32/shlview.c new file mode 100644 index 00000000000..e3e0ef24ed5 --- /dev/null +++ b/rostests/winetests/shell32/shlview.c @@ -0,0 +1,759 @@ +/* + * Unit test of the IShellView + * + * Copyright 2010 Nikolay Sivov for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#define COBJMACROS +#define CONST_VTABLE + +#include "windef.h" +#include "winbase.h" +#include "wtypes.h" +#include "shellapi.h" + +#include "shlguid.h" +#include "shlobj.h" +#include "shobjidl.h" +#include "shlwapi.h" +#include "ocidl.h" +#include "oleauto.h" + +#include "initguid.h" + +#include "wine/test.h" + +#include "msg.h" + +#define LISTVIEW_SEQ_INDEX 0 +#define NUM_MSG_SEQUENCES 1 + +DEFINE_GUID(IID_IPersistHistory, 0x91a565c1, 0xe38f, 0x11d0, 0x94, 0xbf, 0x00, 0xa0, 0xc9, 0x05, 0x5c, 0xbf); + +static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; + +static LRESULT WINAPI listview_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); + static LONG defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + trace("listview: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(sequences, LISTVIEW_SEQ_INDEX, &msg); + + defwndproc_counter++; + ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam); + defwndproc_counter--; + return ret; +} + +static HWND subclass_listview(HWND hwnd) +{ + WNDPROC oldproc; + HWND listview; + + /* listview is a first child */ + listview = FindWindowExA(hwnd, NULL, WC_LISTVIEWA, NULL); + + oldproc = (WNDPROC)SetWindowLongPtrA(listview, GWLP_WNDPROC, + (LONG_PTR)listview_subclass_proc); + SetWindowLongPtrA(listview, GWLP_USERDATA, (LONG_PTR)oldproc); + + return listview; +} + +/* dummy IDataObject implementation */ +typedef struct { + const IDataObjectVtbl *lpVtbl; + LONG ref; +} IDataObjectImpl; + +static const IDataObjectVtbl IDataObjectImpl_Vtbl; + +static IDataObject* IDataObjectImpl_Construct(void) +{ + IDataObjectImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IDataObjectImpl_Vtbl; + obj->ref = 1; + + return (IDataObject*)obj; +} + +static HRESULT WINAPI IDataObjectImpl_QueryInterface(IDataObject *iface, REFIID riid, void **ppvObj) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDataObject)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IDataObjectImpl_AddRef(IDataObject * iface) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IDataObjectImpl_Release(IDataObject * iface) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IDataObjectImpl_GetData(IDataObject *iface, FORMATETC *pformat, STGMEDIUM *pmedium) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_GetDataHere(IDataObject *iface, FORMATETC *pformat, STGMEDIUM *pmedium) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_QueryGetData(IDataObject *iface, FORMATETC *pformat) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_GetCanonicalFormatEtc( + IDataObject *iface, FORMATETC *pformatIn, FORMATETC *pformatOut) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_SetData( + IDataObject *iface, FORMATETC *pformat, STGMEDIUM *pmedium, BOOL release) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_EnumFormatEtc( + IDataObject *iface, DWORD direction, IEnumFORMATETC **ppenumFormatEtc) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_DAdvise( + IDataObject *iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pSink, DWORD *pConnection) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_DUnadvise(IDataObject *iface, DWORD connection) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObjectImpl_EnumDAdvise(IDataObject *iface, IEnumSTATDATA **ppenumAdvise) +{ + return E_NOTIMPL; +} + +static const IDataObjectVtbl IDataObjectImpl_Vtbl = +{ + IDataObjectImpl_QueryInterface, + IDataObjectImpl_AddRef, + IDataObjectImpl_Release, + IDataObjectImpl_GetData, + IDataObjectImpl_GetDataHere, + IDataObjectImpl_QueryGetData, + IDataObjectImpl_GetCanonicalFormatEtc, + IDataObjectImpl_SetData, + IDataObjectImpl_EnumFormatEtc, + IDataObjectImpl_DAdvise, + IDataObjectImpl_DUnadvise, + IDataObjectImpl_EnumDAdvise +}; + +/* dummy IShellBrowser implementation */ +typedef struct { + const IShellBrowserVtbl *lpVtbl; + LONG ref; +} IShellBrowserImpl; + +static const IShellBrowserVtbl IShellBrowserImpl_Vtbl; + +static IShellBrowser* IShellBrowserImpl_Construct(void) +{ + IShellBrowserImpl *browser; + + browser = HeapAlloc(GetProcessHeap(), 0, sizeof(*browser)); + browser->lpVtbl = &IShellBrowserImpl_Vtbl; + browser->ref = 1; + + return (IShellBrowser*)browser; +} + +static HRESULT WINAPI IShellBrowserImpl_QueryInterface(IShellBrowser *iface, + REFIID riid, + LPVOID *ppvObj) +{ + IShellBrowserImpl *This = (IShellBrowserImpl *)iface; + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IOleWindow) || + IsEqualIID(riid, &IID_IShellBrowser)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IShellBrowserImpl_AddRef(IShellBrowser * iface) +{ + IShellBrowserImpl *This = (IShellBrowserImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IShellBrowserImpl_Release(IShellBrowser * iface) +{ + IShellBrowserImpl *This = (IShellBrowserImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IShellBrowserImpl_GetWindow(IShellBrowser *iface, + HWND *phwnd) +{ + if (phwnd) *phwnd = GetDesktopWindow(); + return S_OK; +} + +static HRESULT WINAPI IShellBrowserImpl_ContextSensitiveHelp(IShellBrowser *iface, + BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface, + LPCITEMIDLIST pidl, + UINT wFlags) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_EnableModelessSB(IShellBrowser *iface, + BOOL fEnable) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_GetControlWindow(IShellBrowser *iface, + UINT id, + HWND *lphwnd) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_GetViewStateStream(IShellBrowser *iface, + DWORD mode, + LPSTREAM *pStrm) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_InsertMenusSB(IShellBrowser *iface, + HMENU hmenuShared, + LPOLEMENUGROUPWIDTHS lpMenuWidths) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_OnViewWindowActive(IShellBrowser *iface, + IShellView *ppshv) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_QueryActiveShellView(IShellBrowser *iface, + IShellView **ppshv) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_RemoveMenusSB(IShellBrowser *iface, + HMENU hmenuShared) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_SendControlMsg(IShellBrowser *iface, + UINT id, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT *pret) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_SetMenuSB(IShellBrowser *iface, + HMENU hmenuShared, + HOLEMENU holemenuReserved, + HWND hwndActiveObject) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_SetStatusTextSB(IShellBrowser *iface, + LPCOLESTR lpszStatusText) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_SetToolbarItems(IShellBrowser *iface, + LPTBBUTTON lpButtons, + UINT nButtons, + UINT uFlags) + +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowserImpl_TranslateAcceleratorSB(IShellBrowser *iface, + LPMSG lpmsg, + WORD wID) + +{ + return E_NOTIMPL; +} + +static const IShellBrowserVtbl IShellBrowserImpl_Vtbl = +{ + IShellBrowserImpl_QueryInterface, + IShellBrowserImpl_AddRef, + IShellBrowserImpl_Release, + IShellBrowserImpl_GetWindow, + IShellBrowserImpl_ContextSensitiveHelp, + IShellBrowserImpl_InsertMenusSB, + IShellBrowserImpl_SetMenuSB, + IShellBrowserImpl_RemoveMenusSB, + IShellBrowserImpl_SetStatusTextSB, + IShellBrowserImpl_EnableModelessSB, + IShellBrowserImpl_TranslateAcceleratorSB, + IShellBrowserImpl_BrowseObject, + IShellBrowserImpl_GetViewStateStream, + IShellBrowserImpl_GetControlWindow, + IShellBrowserImpl_SendControlMsg, + IShellBrowserImpl_QueryActiveShellView, + IShellBrowserImpl_OnViewWindowActive, + IShellBrowserImpl_SetToolbarItems +}; + +static const struct message empty_seq[] = { + { 0 } +}; + +static const struct message folderview_getspacing_seq[] = { + { LVM_GETITEMSPACING, wparam|sent, FALSE }, + { 0 } +}; + +static const struct message folderview_getselectionmarked_seq[] = { + { LVM_GETSELECTIONMARK, sent }, + { 0 } +}; + +static const struct message folderview_getfocused_seq[] = { + { LVM_GETNEXTITEM, sent|wparam|lparam, -1, LVNI_FOCUSED }, + { 0 } +}; + +static const struct message folderview_itemcount_seq[] = { + { LVM_GETITEMCOUNT, sent }, + { 0 } +}; + +static void test_IShellView_CreateViewWindow(void) +{ + IShellFolder *desktop; + FOLDERSETTINGS settings; + IShellView *view; + IDropTarget *dt; + HWND hwnd_view; + HRESULT hr; + RECT r = {0}; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); + ok(hr == S_OK, "got (0x%08x)\n", hr); + +if (0) +{ + /* crashes on native */ + hr = IShellView_CreateViewWindow(view, NULL, &settings, NULL, NULL, NULL); +} + + settings.ViewMode = FVM_ICON; + settings.fFlags = 0; + hwnd_view = (HWND)0xdeadbeef; + hr = IShellView_CreateViewWindow(view, NULL, &settings, NULL, NULL, &hwnd_view); + ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); + ok(hwnd_view == 0, "got %p\n", hwnd_view); + + hwnd_view = (HWND)0xdeadbeef; + hr = IShellView_CreateViewWindow(view, NULL, &settings, NULL, &r, &hwnd_view); + ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); + ok(hwnd_view == 0, "got %p\n", hwnd_view); + + /* ::DragLeave without drag operation */ + hr = IShellView_QueryInterface(view, &IID_IDropTarget, (void**)&dt); + ok(hr == S_OK, "got (0x%08x)\n", hr); + hr = IDropTarget_DragLeave(dt); + ok(hr == S_OK, "got (0x%08x)\n", hr); + IDropTarget_Release(dt); + + IShellView_Release(view); + IShellFolder_Release(desktop); +} + +static void test_IFolderView(void) +{ + IShellFolder *desktop, *folder; + FOLDERSETTINGS settings; + IShellView *view; + IShellBrowser *browser; + IFolderView *fv; + HWND hwnd_view, hwnd_list; + PITEMID_CHILD pidl; + HRESULT hr; + INT ret; + POINT pt; + LONG ref1, ref2; + RECT r; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellView_QueryInterface(view, &IID_IFolderView, (void**)&fv); + if (hr != S_OK) + { + win_skip("IFolderView not supported by desktop folder\n"); + IShellView_Release(view); + IShellFolder_Release(desktop); + return; + } + + /* call methods before window creation */ + hr = IFolderView_GetSpacing(fv, NULL); + ok(hr == S_FALSE || broken(hr == S_OK) /* win7 */, "got (0x%08x)\n", hr); + + pidl = (void*)0xdeadbeef; + hr = IFolderView_Item(fv, 0, &pidl); + ok(hr == E_INVALIDARG || broken(hr == E_FAIL) /* < Vista */, "got (0x%08x)\n", hr); + ok(pidl == 0 || broken(pidl == (void*)0xdeadbeef) /* < Vista */, "got %p\n", pidl); + +if (0) +{ + /* crashes on Vista and Win2k8 - List not created yet case */ + hr = IFolderView_GetSpacing(fv, &pt); + + /* crashes on XP */ + hr = IFolderView_GetSelectionMarkedItem(fv, NULL); + hr = IFolderView_GetFocusedItem(fv, NULL); + + /* crashes on Vista+ */ + hr = IFolderView_Item(fv, 0, NULL); +} + + browser = IShellBrowserImpl_Construct(); + + settings.ViewMode = FVM_ICON; + settings.fFlags = 0; + hwnd_view = (HWND)0xdeadbeef; + r.left = r.top = 0; + r.right = r.bottom = 100; + hr = IShellView_CreateViewWindow(view, NULL, &settings, browser, &r, &hwnd_view); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(IsWindow(hwnd_view), "got %p\n", hwnd_view); + + hwnd_list = subclass_listview(hwnd_view); + if (!hwnd_list) + { + win_skip("Failed to subclass ListView control\n"); + IShellBrowser_Release(browser); + IFolderView_Release(fv); + IShellView_Release(view); + IShellFolder_Release(desktop); + return; + } + + /* IFolderView::GetSpacing */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + hr = IFolderView_GetSpacing(fv, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, empty_seq, "IFolderView::GetSpacing, empty", FALSE); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + hr = IFolderView_GetSpacing(fv, &pt); + ok(hr == S_OK, "got (0x%08x)\n", hr); + /* fails with empty sequence on win7 for unknown reason */ + if (sequences[LISTVIEW_SEQ_INDEX]->count) + { + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getspacing_seq, "IFolderView::GetSpacing", FALSE); + ok(pt.x > 0, "got %d\n", pt.x); + ok(pt.y > 0, "got %d\n", pt.y); + ret = SendMessageA(hwnd_list, LVM_GETITEMSPACING, 0, 0); + ok(pt.x == LOWORD(ret) && pt.y == HIWORD(ret), "got (%d, %d)\n", LOWORD(ret), HIWORD(ret)); + } + + /* IFolderView::GetSelectionMarkedItem */ +if (0) +{ + /* crashes on XP */ + hr = IFolderView_GetSelectionMarkedItem(fv, NULL); +} + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + hr = IFolderView_GetSelectionMarkedItem(fv, &ret); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getselectionmarked_seq, + "IFolderView::GetSelectionMarkedItem", FALSE); + + /* IFolderView::GetFocusedItem */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + hr = IFolderView_GetFocusedItem(fv, &ret); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getfocused_seq, + "IFolderView::GetFocusedItem", FALSE); + + /* IFolderView::GetFolder, just return pointer */ +if (0) +{ + /* crashes on XP */ + hr = IFolderView_GetFolder(fv, NULL, (void**)&folder); + hr = IFolderView_GetFolder(fv, NULL, NULL); +} + + hr = IFolderView_GetFolder(fv, &IID_IShellFolder, NULL); + ok(hr == E_POINTER, "got (0x%08x)\n", hr); + + ref1 = IShellFolder_AddRef(desktop); + IShellFolder_Release(desktop); + hr = IFolderView_GetFolder(fv, &IID_IShellFolder, (void**)&folder); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ref2 = IShellFolder_AddRef(desktop); + IShellFolder_Release(desktop); + ok(ref1 == ref2, "expected same refcount, got %d\n", ref2); + ok(desktop == folder, "\n"); + + /* IFolderView::ItemCount */ +if (0) +{ + /* crashes on XP */ + hr = IFolderView_ItemCount(fv, SVGIO_ALLVIEW, NULL); +} + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + hr = IFolderView_ItemCount(fv, SVGIO_ALLVIEW, &ret); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_itemcount_seq, + "IFolderView::ItemCount", FALSE); + + IShellBrowser_Release(browser); + IFolderView_Release(fv); + IShellView_Release(view); + IShellFolder_Release(desktop); +} + +static void test_GetItemObject(void) +{ + IShellFolder *desktop; + IShellView *view; + IUnknown *unk; + HRESULT hr; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + /* from documentation three interfaces are supported for SVGIO_BACKGROUND: + IContextMenu, IDispatch, IPersistHistory */ + hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IContextMenu, (void**)&unk); + ok(hr == S_OK, "got (0x%08x)\n", hr); + IUnknown_Release(unk); + + unk = NULL; + hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&unk); + todo_wine ok(hr == S_OK || broken(hr == E_NOTIMPL) /* NT4 */, "got (0x%08x)\n", hr); + if (unk) IUnknown_Release(unk); + + unk = NULL; + hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IPersistHistory, (void**)&unk); + todo_wine ok(hr == S_OK || broken(hr == E_NOTIMPL) /* W9x, NT4 */, "got (0x%08x)\n", hr); + if (unk) IUnknown_Release(unk); + + /* example of unsupported interface, base for IPersistHistory */ + hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IPersist, (void**)&unk); + ok(hr == E_NOINTERFACE || broken(hr == E_NOTIMPL) /* W2K */, "got (0x%08x)\n", hr); + + IShellView_Release(view); + IShellFolder_Release(desktop); +} + +static void test_IShellFolderView(void) +{ + IShellFolderView *folderview; + IShellFolder *desktop; + IShellView *view; + IDataObject *obj; + UINT i; + HRESULT hr; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellView_QueryInterface(view, &IID_IShellFolderView, (void**)&folderview); + if (hr != S_OK) + { + win_skip("IShellView doesn't provide IShellFolderView on this platform\n"); + IShellView_Release(view); + IShellFolder_Release(desktop); + return; + } + + /* ::MoveIcons */ + obj = IDataObjectImpl_Construct(); + hr = IShellFolderView_MoveIcons(folderview, obj); + ok(hr == E_NOTIMPL || broken(hr == S_OK) /* W98 */, "got (0x%08x)\n", hr); + IDataObject_Release(obj); + + /* ::SetRedraw without list created */ + hr = IShellFolderView_SetRedraw(folderview, TRUE); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + /* ::QuerySupport */ + hr = IShellFolderView_QuerySupport(folderview, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + i = 0xdeadbeef; + hr = IShellFolderView_QuerySupport(folderview, &i); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(i == 0xdeadbeef, "got %d\n", i); + + /* ::RemoveObject */ + i = 0xdeadbeef; + hr = IShellFolderView_RemoveObject(folderview, NULL, &i); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(i == 0 || i == -1 /* Win7 */ || broken(i == 0xdeadbeef) /* Vista, 2k8 */, + "got %d\n", i); + + IShellFolderView_Release(folderview); + + IShellView_Release(view); + IShellFolder_Release(desktop); +} + +static void test_IOleWindow(void) +{ + IShellFolder *desktop; + IShellView *view; + HRESULT hr; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + /* IShellView::ContextSensitiveHelp */ + hr = IShellView_ContextSensitiveHelp(view, TRUE); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + hr = IShellView_ContextSensitiveHelp(view, FALSE); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + + IShellView_Release(view); + IShellFolder_Release(desktop); +} + +START_TEST(shlview) +{ + OleInitialize(NULL); + + init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + + test_IShellView_CreateViewWindow(); + test_IFolderView(); + test_GetItemObject(); + test_IShellFolderView(); + test_IOleWindow(); + + OleUninitialize(); +} diff --git a/rostests/winetests/shell32/testlist.c b/rostests/winetests/shell32/testlist.c index c432c064112..8f9119596c9 100644 --- a/rostests/winetests/shell32/testlist.c +++ b/rostests/winetests/shell32/testlist.c @@ -12,11 +12,11 @@ extern void func_generated(void); extern void func_progman_dde(void); extern void func_shelllink(void); extern void func_shellpath(void); -extern void func_shfldr_netplaces(void); extern void func_shfldr_special(void); extern void func_shlexec(void); extern void func_shlfileop(void); extern void func_shlfolder(void); +extern void func_shlview(void); extern void func_string(void); extern void func_systray(void); @@ -28,11 +28,11 @@ const struct test winetest_testlist[] = { "progman_dde", func_progman_dde }, { "shelllink", func_shelllink }, { "shellpath", func_shellpath }, - { "shfldr_netplaces", func_shfldr_netplaces }, { "shfldr_special", func_shfldr_special }, { "shlexec", func_shlexec }, { "shlfileop", func_shlfileop }, { "shlfolder", func_shlfolder }, + { "shlview", func_shlview }, { "string", func_string }, { "systray", func_systray }, { 0, 0 }