📄 shellpath.c
字号:
pidl = NULL;
hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, (HANDLE)2, 0, &pidl);
ok(hr == E_FAIL,
"SHGetFolderLocation(NULL, CSIDL_FAVORITES, 2, 0, &pidl)\n"
"returned 0x%08lx, expected E_FAIL\n", hr);
if (SUCCEEDED(hr))
IMalloc_Free(pMalloc, pidl);
/* check reserved is not zero: */
pidl = NULL;
hr = pSHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 1, &pidl);
ok(hr == E_INVALIDARG,
"SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 1, &pidl)\n"
"returned 0x%08lx, expected E_INVALIDARG\n", hr);
if (SUCCEEDED(hr))
IMalloc_Free(pMalloc, pidl);
/* a NULL pidl pointer crashes, so don't test it */
}
static void testSHGetSpecialFolderLocationInvalidArgs(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%08lx, "
"expected E_INVALIDARG\n", hr);
}
static void testSHGetFolderPathInvalidArgs(void)
{
char path[MAX_PATH];
HRESULT hr;
if (!pSHGetFolderPathA) return;
/* 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,
"SHGetFolderPathA(NULL, CSIDL_DESKTOP, 2, SHGFP_TYPE_DEFAULT, path)\n"
"returned 0x%08lx, 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)\n"
"returned 0x%08lx, expected E_INVALIDARG\n", hr);
}
static void testSHGetSpecialFolderPathInvalidArgs(void)
{
char path[MAX_PATH];
BOOL ret;
if (!pSHGetSpecialFolderPathA) return;
ret = pSHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE);
ok(!ret,
"SHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE)\n"
"returned TRUE, expected FALSE\n");
/* odd but true: calling with a NULL path still succeeds if it's a real
* dir
*/
ret = pSHGetSpecialFolderPathA(NULL, NULL, CSIDL_PROGRAMS, FALSE);
ok(ret,
"SHGetSpecialFolderPathA(NULL, NULL, CSIDL_PROGRAMS, FALSE)\n"
"returned FALSE, expected TRUE\n");
ret = pSHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE);
ok(!ret,
"SHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE)\n"
"returned TRUE, expected FALSE\n");
}
static void testApiParameters(void)
{
testSHGetFolderLocationInvalidArgs();
testSHGetSpecialFolderLocationInvalidArgs();
testSHGetFolderPathInvalidArgs();
testSHGetSpecialFolderPathInvalidArgs();
}
/* Returns the folder's PIDL type, or 0xff if one can't be found. */
static BYTE testSHGetFolderLocation(BOOL optional, int folder)
{
LPITEMIDLIST pidl;
HRESULT hr;
BYTE ret = 0xff;
/* treat absence of function as success */
if (!pSHGetFolderLocation) return TRUE;
pidl = NULL;
hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl);
ok(SUCCEEDED(hr) || optional,
"SHGetFolderLocation(NULL, %s, NULL, 0, &pidl)\n"
"failed: 0x%08lx\n", getFolderName(folder), hr);
if (SUCCEEDED(hr))
{
ok(pidl != NULL,
"SHGetFolderLocation(NULL, %s, NULL, 0, &pidl)\n"
"succeeded, but returned pidl is NULL\n", getFolderName(folder));
if (pidl)
{
LPITEMIDLIST pidlLast = pILFindLastID(pidl);
ok(pidlLast != NULL, "%s: ILFindLastID failed\n",
getFolderName(folder));
if (pidlLast)
ret = pidlLast->mkid.abID[0];
IMalloc_Free(pMalloc, pidl);
}
}
return ret;
}
/* Returns the folder's PIDL type, or 0xff if one can't be found. */
static BYTE testSHGetSpecialFolderLocation(BOOL optional, int folder)
{
LPITEMIDLIST pidl;
HRESULT hr;
BYTE ret = 0xff;
/* treat absence of function as success */
if (!pSHGetSpecialFolderLocation) return TRUE;
pidl = NULL;
hr = pSHGetSpecialFolderLocation(NULL, folder, &pidl);
ok(SUCCEEDED(hr) || optional,
"SHGetSpecialFolderLocation(NULL, %s, &pidl)\n"
"failed: 0x%08lx\n", getFolderName(folder), hr);
if (SUCCEEDED(hr))
{
ok(pidl != NULL,
"SHGetSpecialFolderLocation(NULL, %s, &pidl)\n"
"succeeded, but returned pidl is NULL\n", getFolderName(folder));
if (pidl)
{
LPITEMIDLIST pidlLast = pILFindLastID(pidl);
ok(pidlLast != NULL,
"%s: ILFindLastID failed\n", getFolderName(folder));
if (pidlLast)
ret = pidlLast->mkid.abID[0];
IMalloc_Free(pMalloc, pidl);
}
}
return ret;
}
static void testSHGetFolderPath(BOOL optional, int folder)
{
char path[MAX_PATH];
HRESULT hr;
if (!pSHGetFolderPathA) return;
hr = pSHGetFolderPathA(NULL, folder, NULL, SHGFP_TYPE_CURRENT, path);
ok(SUCCEEDED(hr) || optional,
"SHGetFolderPathA(NULL, %s, NULL, SHGFP_TYPE_CURRENT, path)\n"
"failed: 0x%08lx\n", getFolderName(folder), hr);
}
static void testSHGetSpecialFolderPath(BOOL optional, int folder)
{
char path[MAX_PATH];
BOOL ret;
if (!pSHGetSpecialFolderPathA) return;
ret = pSHGetSpecialFolderPathA(NULL, path, folder, FALSE);
if (ret && winetest_interactive)
printf("%s: %s\n", getFolderName(folder), path);
ok(ret || optional,
"SHGetSpecialFolderPathA(NULL, path, %s, FALSE) failed\n",
getFolderName(folder));
}
static void testShellValues(const struct shellExpectedValues testEntries[],
int numEntries, BOOL optional)
{
int i;
for (i = 0; i < numEntries; i++)
{
BYTE type;
type = testSHGetFolderLocation(optional, testEntries[i].folder);
ok(type == testEntries[i].pidlType || optional,
"%s has type %d (0x%02x), expected %d (0x%02x)\n",
getFolderName(testEntries[i].folder), type, type,
testEntries[i].pidlType, testEntries[i].pidlType);
type = testSHGetSpecialFolderLocation(optional, testEntries[i].folder);
ok(type == testEntries[i].pidlType || optional,
"%s has type %d (0x%02x), expected %d (0x%02x)\n",
getFolderName(testEntries[i].folder), type, type,
testEntries[i].pidlType, testEntries[i].pidlType);
switch (type)
{
case PT_FOLDER:
case PT_DRIVE:
case PT_DRIVE2:
case PT_IESPECIAL2:
testSHGetFolderPath(optional, testEntries[i].folder);
testSHGetSpecialFolderPath(optional, testEntries[i].folder);
break;
}
}
}
/* Attempts to verify that the folder path corresponding to the folder CSIDL
* value has the same value as the environment variable with name envVar.
* Doesn't mind if SHGetSpecialFolderPath fails for folder or if envVar isn't
* set in this environment; different OS and shell version behave differently.
* However, if both are present, fails if envVar's value is not the same
* (byte-for-byte) as what SHGetSpecialFolderPath returns.
*/
static void matchSpecialFolderPathToEnv(int folder, const char *envVar)
{
char path[MAX_PATH];
if (!pSHGetSpecialFolderPathA) return;
if (pSHGetSpecialFolderPathA(NULL, path, folder, FALSE))
{
char *envVal = getenv(envVar);
ok(!envVal || !lstrcmpiA(envVal, path),
"%%%s%% does not match SHGetSpecialFolderPath:\n"
"%%%s%% is %s\nSHGetSpecialFolderPath returns %s\n",
envVar, envVar, envVal, path);
}
}
/* Attempts to match the GUID returned by SHGetFolderLocation for folder with
* GUID. Assumes the type of the returned PIDL is in fact a GUID, but doesn't
* fail if it isn't--that check should already have been done.
* Fails if the returned PIDL is a GUID whose value does not match guid.
*/
static void matchGUID(int folder, const GUID *guid)
{
LPITEMIDLIST pidl;
HRESULT hr;
if (!pSHGetFolderLocation) return;
if (!guid) return;
pidl = NULL;
hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl);
if (SUCCEEDED(hr))
{
LPITEMIDLIST pidlLast = pILFindLastID(pidl);
if (pidlLast && (pidlLast->mkid.abID[0] == PT_SHELLEXT ||
pidlLast->mkid.abID[0] == PT_GUID))
{
GUID *shellGuid = (GUID *)(pidlLast->mkid.abID + 2);
ok(IsEqualIID(shellGuid, guid),
"%s: got GUID %s, expected %s\n", getFolderName(folder),
printGUID(shellGuid), printGUID(guid));
}
IMalloc_Free(pMalloc, pidl);
}
}
static void testDesktop(void)
{
testSHGetFolderPath(FALSE, CSIDL_DESKTOP);
testSHGetSpecialFolderPath(FALSE, CSIDL_DESKTOP);
/* Test the desktop; even though SHITEMID should always contain abID of at
* least one type, when cb is 0 its value is undefined. So don't check
* what the returned type is, just make sure it exists.
*/
testSHGetFolderLocation(FALSE, CSIDL_DESKTOP);
testSHGetSpecialFolderLocation(FALSE, CSIDL_DESKTOP);
}
static void testPersonal(void)
{
BYTE type;
/* The pidl may be a real folder, or a virtual directory, or a drive if the
* home directory is set to the root directory of a drive.
*/
type = testSHGetFolderLocation(FALSE, CSIDL_PERSONAL);
ok(type == PT_FOLDER || type == PT_GUID || type == PT_DRIVE,
"CSIDL_PERSONAL returned invalid type 0x%02x, "
"expected PT_FOLDER or PT_GUID\n", type);
if (type == PT_FOLDER)
testSHGetFolderPath(FALSE, CSIDL_PERSONAL);
type = testSHGetSpecialFolderLocation(FALSE, CSIDL_PERSONAL);
ok(type == PT_FOLDER || type == PT_GUID || type == PT_DRIVE,
"CSIDL_PERSONAL returned invalid type 0x%02x, "
"expected PT_FOLDER or PT_GUID\n", type);
if (type == PT_FOLDER)
testSHGetSpecialFolderPath(FALSE, CSIDL_PERSONAL);
}
/* Checks the PIDL type of all the known values. */
static void testPidlTypes(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -