static void (WINAPI *pFreeMRUList)(HANDLE);
static INT (WINAPI *pAddMRUStringA)(HANDLE,LPCSTR);
static INT (WINAPI *pEnumMRUList)(HANDLE,INT,LPVOID,DWORD);
+static INT (WINAPI *pEnumMRUListW)(HANDLE,INT,LPVOID,DWORD);
+static HANDLE (WINAPI *pCreateMRUListLazyA)(LPCREATEMRULISTA, DWORD, DWORD, DWORD);
+static INT (WINAPI *pFindMRUData)(HANDLE, LPCVOID, DWORD, LPINT);
+static INT (WINAPI *pAddMRUData)(HANDLE, LPCVOID, DWORD);
/*
static INT (WINAPI *pFindMRUStringA)(HANDLE,LPCSTR,LPINT);
*/
+static void InitPointers(void)
+{
+ pCreateMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)151);
+ pFreeMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)152);
+ pAddMRUStringA = (void*)GetProcAddress(hComctl32,(LPCSTR)153);
+ pEnumMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)154);
+ pCreateMRUListLazyA = (void*)GetProcAddress(hComctl32,(LPCSTR)157);
+ pAddMRUData = (void*)GetProcAddress(hComctl32,(LPCSTR)167);
+ pFindMRUData = (void*)GetProcAddress(hComctl32,(LPCSTR)169);
+ pEnumMRUListW = (void*)GetProcAddress(hComctl32,(LPCSTR)403);
+}
+
/* Based on RegDeleteTreeW from dlls/advapi32/registry.c */
static LSTATUS mru_RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
{
HKEY hKey;
INT iRet;
- pCreateMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)151);
- pFreeMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)152);
- pAddMRUStringA = (void*)GetProcAddress(hComctl32,(LPCSTR)153);
- pEnumMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)154);
-
if (!pCreateMRUListA || !pFreeMRUList || !pAddMRUStringA || !pEnumMRUList)
{
skip("MRU entry points not found\n");
/* check entry 0 */
buffer[0] = 0;
iRet = pEnumMRUList(hMRU, 0, buffer, 255);
- todo_wine ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
+ ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
ok(strcmp(buffer, checks[3]) == 0, "EnumMRUList expected %s, got %s\n", checks[3], buffer);
/* check entry 0 with a too small buffer */
buffer[2] = 'A'; /* unchanged */
buffer[3] = 0; /* unchanged */
iRet = pEnumMRUList(hMRU, 0, buffer, 2);
- todo_wine ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
- todo_wine ok(strcmp(buffer, "T") == 0, "EnumMRUList expected %s, got %s\n", "T", buffer);
+ ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
+ ok(strcmp(buffer, "T") == 0, "EnumMRUList expected %s, got %s\n", "T", buffer);
/* make sure space after buffer has old values */
ok(buffer[2] == 'A', "EnumMRUList expected %02x, got %02x\n", 'A', buffer[2]);
/* check entry 1 */
buffer[0] = 0;
iRet = pEnumMRUList(hMRU, 1, buffer, 255);
- todo_wine ok(iRet == lstrlen(checks[1]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[1]), iRet);
+ ok(iRet == lstrlen(checks[1]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[1]), iRet);
ok(strcmp(buffer, checks[1]) == 0, "EnumMRUList expected %s, got %s\n", checks[1], buffer);
/* check entry 2 */
buffer[0] = 0;
iRet = pEnumMRUList(hMRU, 2, buffer, 255);
- todo_wine ok(iRet == lstrlen(checks[2]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[2]), iRet);
+ ok(iRet == lstrlen(checks[2]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[2]), iRet);
ok(strcmp(buffer, checks[2]) == 0, "EnumMRUList expected %s, got %s\n", checks[2], buffer);
/* check out of bounds entry 3 */
/* FreeMRUList(NULL) crashes on Win98 OSR0 */
}
+static void test_CreateMRUListLazyA(void)
+{
+ HANDLE hMRU;
+ HKEY hKey;
+ CREATEMRULISTA listA = { 0 };
+
+ if (!pCreateMRUListLazyA || !pFreeMRUList)
+ {
+ win_skip("CreateMRUListLazyA or FreeMRUList entry points not found\n");
+ return;
+ }
+
+ /* wrong size */
+ listA.cbSize = sizeof(listA) + 1;
+ hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+ ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU);
+ listA.cbSize = 4;
+ hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+ ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU);
+ /* NULL hKey */
+ listA.cbSize = sizeof(listA);
+ listA.hKey = NULL;
+ hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+ ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU);
+ /* NULL subkey */
+ ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey),
+ "Couldn't create test key \"%s\"\n", REG_TEST_KEYA);
+ listA.cbSize = sizeof(listA);
+ listA.hKey = hKey;
+ listA.lpszSubKey = NULL;
+ hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+ ok(hMRU == NULL || broken(hMRU != NULL), /* Win9x */
+ "Expected NULL handle, got %p\n", hMRU);
+ if (hMRU) pFreeMRUList(hMRU);
+}
+
+static void test_EnumMRUList(void)
+{
+ if (!pEnumMRUList || !pEnumMRUListW)
+ {
+ win_skip("EnumMRUListA/EnumMRUListW entry point not found\n");
+ return;
+ }
+
+ /* NULL handle */
+ if (0)
+ {
+ /* crashes on NT4, passed on Win2k, XP, 2k3, Vista, 2k8 */
+ pEnumMRUList(NULL, 0, NULL, 0);
+ pEnumMRUListW(NULL, 0, NULL, 0);
+ }
+}
+
+static void test_FindMRUData(void)
+{
+ INT iRet;
+
+ if (!pFindMRUData)
+ {
+ win_skip("FindMRUData entry point not found\n");
+ return;
+ }
+
+ /* NULL handle */
+ iRet = pFindMRUData(NULL, NULL, 0, NULL);
+ ok(iRet == -1, "FindMRUData expected -1, got %d\n", iRet);
+}
+
+static void test_AddMRUData(void)
+{
+ INT iRet;
+
+ if (!pAddMRUData)
+ {
+ win_skip("AddMRUData entry point not found\n");
+ return;
+ }
+
+ /* NULL handle */
+ iRet = pFindMRUData(NULL, NULL, 0, NULL);
+ ok(iRet == -1, "AddMRUData expected -1, got %d\n", iRet);
+}
+
START_TEST(mru)
{
hComctl32 = GetModuleHandleA("comctl32.dll");
if (!create_reg_entries())
return;
+ InitPointers();
+
test_MRUListA();
+ test_CreateMRUListLazyA();
+ test_EnumMRUList();
+ test_FindMRUData();
+ test_AddMRUData();
delete_reg_entries();
}