| /* Unit test suite for SHLWAPI Class ID functions | |
| * | |
| * Copyright 2003 Jon Griffiths | |
| * | |
| * 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 <stdio.h> | |
| #include "wine/test.h" | |
| #include "winbase.h" | |
| #include "winerror.h" | |
| #include "winnls.h" | |
| #include "winuser.h" | |
| #include "initguid.h" | |
| #include "shlguid.h" | |
| #include "shobjidl.h" | |
| #include "olectl.h" | |
| DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); | |
| /* This GUID has been removed from the PSDK */ | |
| DEFINE_OLEGUID(WINE_IID_IDelayedRelease, 0x000214EDL, 0, 0); | |
| /* Function ptrs for ordinal calls */ | |
| static HMODULE hShlwapi = 0; | |
| static BOOL (WINAPI *pSHLWAPI_269)(LPCSTR, CLSID *) = 0; | |
| static DWORD (WINAPI *pSHLWAPI_23)(REFGUID, LPSTR, INT) = 0; | |
| /* GUIDs to test */ | |
| static const GUID * TEST_guids[] = { | |
| &CLSID_ShellDesktop, | |
| &CLSID_ShellLink, | |
| &CATID_BrowsableShellExt, | |
| &CATID_BrowseInPlace, | |
| &CATID_DeskBand, | |
| &CATID_InfoBand, | |
| &CATID_CommBand, | |
| &FMTID_Intshcut, | |
| &FMTID_InternetSite, | |
| &CGID_Explorer, | |
| &CGID_ShellDocView, | |
| &CGID_ShellServiceObject, | |
| &CGID_ExplorerBarDoc, | |
| &IID_INewShortcutHookA, | |
| &IID_IShellIcon, | |
| &IID_IShellFolder, | |
| &IID_IShellExtInit, | |
| &IID_IShellPropSheetExt, | |
| &IID_IPersistFolder, | |
| &IID_IExtractIconA, | |
| &IID_IShellDetails, | |
| &WINE_IID_IDelayedRelease, | |
| &IID_IShellLinkA, | |
| &IID_IShellCopyHookA, | |
| &IID_IFileViewerA, | |
| &IID_ICommDlgBrowser, | |
| &IID_IEnumIDList, | |
| &IID_IFileViewerSite, | |
| &IID_IContextMenu2, | |
| &IID_IShellExecuteHookA, | |
| &IID_IPropSheetPage, | |
| &IID_INewShortcutHookW, | |
| &IID_IFileViewerW, | |
| &IID_IShellLinkW, | |
| &IID_IExtractIconW, | |
| &IID_IShellExecuteHookW, | |
| &IID_IShellCopyHookW, | |
| &IID_IRemoteComputer, | |
| &IID_IQueryInfo, | |
| &IID_IDockingWindow, | |
| &IID_IDockingWindowSite, | |
| &CLSID_NetworkPlaces, | |
| &CLSID_NetworkDomain, | |
| &CLSID_NetworkServer, | |
| &CLSID_NetworkShare, | |
| &CLSID_MyComputer, | |
| &CLSID_Internet, | |
| &CLSID_ShellFSFolder, | |
| &CLSID_RecycleBin, | |
| &CLSID_ControlPanel, | |
| &CLSID_Printers, | |
| &CLSID_MyDocuments, | |
| NULL | |
| }; | |
| DEFINE_GUID(IID_Endianness, 0x01020304, 0x0506, 0x0708, 0x09, 0x0A, 0x0B, | |
| 0x0C, 0x0D, 0x0E, 0x0F, 0x0A); | |
| static void test_ClassIDs(void) | |
| { | |
| const GUID **guids = TEST_guids; | |
| char szBuff[256]; | |
| GUID guid; | |
| DWORD dwLen; | |
| BOOL bRet; | |
| int i = 0; | |
| BOOL is_vista = FALSE; | |
| if (!pSHLWAPI_269 || !pSHLWAPI_23) | |
| return; | |
| while (*guids) | |
| { | |
| dwLen = pSHLWAPI_23(*guids, szBuff, 256); | |
| if (!i && dwLen == S_OK) is_vista = TRUE; /* seems to return an HRESULT on vista */ | |
| ok(dwLen == (is_vista ? S_OK : 39), "wrong size %u for id %d\n", dwLen, i); | |
| bRet = pSHLWAPI_269(szBuff, &guid); | |
| ok(bRet != FALSE, "created invalid string '%s'\n", szBuff); | |
| if (bRet) | |
| ok(IsEqualGUID(*guids, &guid), "GUID created wrong %d\n", i); | |
| guids++; | |
| i++; | |
| } | |
| /* Test endianness */ | |
| dwLen = pSHLWAPI_23(&IID_Endianness, szBuff, 256); | |
| ok(dwLen == (is_vista ? S_OK : 39), "wrong size %u for IID_Endianness\n", dwLen); | |
| ok(!strcmp(szBuff, "{01020304-0506-0708-090A-0B0C0D0E0F0A}"), | |
| "Endianness Broken, got '%s'\n", szBuff); | |
| /* test lengths */ | |
| szBuff[0] = ':'; | |
| dwLen = pSHLWAPI_23(&IID_Endianness, szBuff, 0); | |
| ok(dwLen == (is_vista ? E_FAIL : 0), "accepted bad length\n"); | |
| ok(szBuff[0] == ':', "wrote to buffer with no length\n"); | |
| szBuff[0] = ':'; | |
| dwLen = pSHLWAPI_23(&IID_Endianness, szBuff, 38); | |
| ok(dwLen == (is_vista ? E_FAIL : 0), "accepted bad length\n"); | |
| ok(szBuff[0] == ':', "wrote to buffer with no length\n"); | |
| szBuff[0] = ':'; | |
| dwLen = pSHLWAPI_23(&IID_Endianness, szBuff, 39); | |
| ok(dwLen == (is_vista ? S_OK : 39), "rejected ok length\n"); | |
| ok(szBuff[0] == '{', "Didn't write to buffer with ok length\n"); | |
| /* Test string */ | |
| strcpy(szBuff, "{xxx-"); | |
| bRet = pSHLWAPI_269(szBuff, &guid); | |
| ok(bRet == FALSE, "accepted invalid string\n"); | |
| dwLen = pSHLWAPI_23(&IID_Endianness, szBuff, 39); | |
| ok(dwLen == (is_vista ? S_OK : 39), "rejected ok length\n"); | |
| ok(szBuff[0] == '{', "Didn't write to buffer with ok length\n"); | |
| } | |
| static void test_CLSIDFromProgIDWrap(void) | |
| { | |
| HRESULT (WINAPI *pCLSIDFromProgIDWrap)(LPCOLESTR,LPCLSID); | |
| CLSID clsid = IID_NULL; | |
| HRESULT hres; | |
| static const WCHAR wszStdPicture[] = {'S','t','d','P','i','c','t','u','r','e',0}; | |
| pCLSIDFromProgIDWrap = (void*)GetProcAddress(hShlwapi,(char*)435); | |
| hres = pCLSIDFromProgIDWrap(wszStdPicture, &clsid); | |
| ok(hres == S_OK, "CLSIDFromProgIDWrap failed: %08x\n", hres); | |
| ok(IsEqualGUID(&CLSID_StdPicture, &clsid), "wrong clsid\n"); | |
| hres = pCLSIDFromProgIDWrap(NULL, &clsid); | |
| ok(hres == E_INVALIDARG, "CLSIDFromProgIDWrap failed: %08x, expected E_INVALIDARG\n", hres); | |
| hres = pCLSIDFromProgIDWrap(wszStdPicture, NULL); | |
| ok(hres == E_INVALIDARG, "CLSIDFromProgIDWrap failed: %08x, expected E_INVALIDARG\n", hres); | |
| } | |
| START_TEST(clsid) | |
| { | |
| hShlwapi = GetModuleHandleA("shlwapi.dll"); | |
| /* SHCreateStreamOnFileEx was introduced in shlwapi v6.0 */ | |
| if(!GetProcAddress(hShlwapi, "SHCreateStreamOnFileEx")){ | |
| win_skip("Too old shlwapi version\n"); | |
| return; | |
| } | |
| pSHLWAPI_269 = (void*)GetProcAddress(hShlwapi, (LPSTR)269); | |
| pSHLWAPI_23 = (void*)GetProcAddress(hShlwapi, (LPSTR)23); | |
| test_ClassIDs(); | |
| test_CLSIDFromProgIDWrap(); | |
| } |