1
2 #include "precomp.h"
3
test_LoadImage_DataFile(void)4 static void test_LoadImage_DataFile(void)
5 {
6 static const struct
7 {
8 int result;
9 LPCWSTR file;
10 int res_id;
11 UINT lr;
12 BOOL same_handle;
13 BOOL after_unload; /* LR_SHARED stays valid */
14 }
15 tests[] =
16 {
17 { 1, L"shell32.dll", 2, 0, 0, 0 },
18 { 1, L"shell32.dll", 2, LR_SHARED, 1, 1 },
19 { 0, L"shell32.dll", 0xfff0, 0, 1, 0 }, /* Icon should not exist */
20 { 1, L"regedit.exe", 100, 0, 0, 0 },
21 { 1, L"regedit.exe", 100, LR_SHARED, 1, 1 }
22 };
23
24 SIZE_T i;
25 for (i = 0; i < ARRAY_SIZE(tests); ++i)
26 {
27 HANDLE handle1, handle2;
28 HMODULE hMod = LoadLibraryExW(tests[i].file, NULL, LOAD_LIBRARY_AS_DATAFILE);
29 if (!((SIZE_T)hMod & 3))
30 {
31 skip("Could not load library as datafile %ls\n", tests[i].file);
32 continue;
33 }
34
35 handle1 = LoadImage(hMod, MAKEINTRESOURCE(tests[i].res_id), IMAGE_ICON, 0, 0, tests[i].lr);
36 ok(!!handle1 == !!tests[i].result, "Failed to load %ls,-%d from %p\n", tests[i].file, tests[i].res_id, hMod);
37
38 handle2 = LoadImage(hMod, MAKEINTRESOURCE(tests[i].res_id), IMAGE_ICON, 0, 0, tests[i].lr);
39 ok(!!(handle1 == handle2) == !!tests[i].same_handle, "Shared handles don't match\n");
40
41 FreeLibrary(hMod);
42
43 handle1 = LoadImage(hMod, MAKEINTRESOURCE(tests[i].res_id), IMAGE_ICON, 0, 0, tests[i].lr);
44 ok(!!handle1 == !!tests[i].after_unload, "LR_%x handle should %sload after FreeLibrary\n", tests[i].lr, tests[i].after_unload ? "" : "not ");
45 }
46 }
47
START_TEST(LoadImage)48 START_TEST(LoadImage)
49 {
50 char path[MAX_PATH];
51 PROCESS_INFORMATION pi;
52 STARTUPINFO si;
53 HANDLE handle;
54
55 char **test_argv;
56 int argc = winetest_get_mainargs( &test_argv );
57
58 /* Now check its behaviour regarding Shared icons/cursors */
59 handle = LoadImageW( GetModuleHandle(NULL), L"TESTCURSOR", IMAGE_CURSOR, 0, 0, LR_SHARED | LR_DEFAULTSIZE );
60 ok(handle != 0, "\n");
61
62 if (argc >= 3)
63 {
64 HANDLE arg;
65 HICON hCopy;
66 HBITMAP hbmp;
67 HDC hdc, hdcScreen;
68 ICONINFO ii;
69
70 sscanf (test_argv[2], "%Iu", (ULONG_PTR*) &arg);
71
72 ok(handle != arg, "Got same handles\n");
73
74 /* Try copying it */
75 hCopy = CopyIcon(arg);
76 ok(hCopy != NULL, "\n");
77 ok(DestroyIcon(hCopy), "\n");
78
79 hCopy = CopyImage(arg, IMAGE_CURSOR, 0, 0, 0);
80 ok(hCopy != NULL, "\n");
81 ok(DestroyIcon(hCopy), "\n");
82 /* Unlike the original, this one is not shared */
83 ok(!DestroyIcon(hCopy), "\n");
84
85 hCopy = CopyImage(arg, IMAGE_CURSOR, 0, 0, LR_COPYFROMRESOURCE);
86 ok(hCopy != NULL, "\n");
87 ok(DestroyIcon(hCopy), "\n");
88 /* Unlike the original, this one is not shared */
89 ok(!DestroyIcon(hCopy), "\n");
90
91 hCopy = CopyImage(arg, IMAGE_CURSOR, 0, 0, LR_COPYFROMRESOURCE | LR_SHARED);
92 ok(hCopy != NULL, "\n");
93 ok(DestroyIcon(hCopy), "\n");
94 /* This one is shared */
95 ok(DestroyIcon(hCopy), "\n");
96
97 hCopy = CopyImage(arg, IMAGE_CURSOR, 0, 0, LR_SHARED);
98 ok(hCopy != NULL, "\n");
99 ok(DestroyIcon(hCopy), "DestroyIcon should succeed.\n");
100 /* This one is shared */
101 ok(DestroyIcon(hCopy) == 0, "DestroyIcon should fail.\n");
102
103 /* Try various usual functions */
104 hdcScreen = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
105 ok(hdcScreen != NULL, "\n");
106 hdc = CreateCompatibleDC(hdcScreen);
107 ok(hdc != NULL, "\n");
108 hbmp = CreateCompatibleBitmap(hdcScreen, 64, 64);
109 ok(hbmp != NULL, "\n");
110 hbmp = SelectObject(hdc, hbmp);
111 ok(hbmp != NULL, "\n");
112
113 ok(DrawIcon(hdc, 0, 0, arg), "\n");
114 hbmp = SelectObject(hdc, hbmp);
115 DeleteObject(hbmp);
116 DeleteDC(hdc);
117 DeleteDC(hdcScreen);
118
119 ok(GetIconInfo(arg, &ii), "\n");
120 ok(ii.hbmMask != NULL, "\n");
121 DeleteObject(ii.hbmMask);
122 if(ii.hbmColor) DeleteObject(ii.hbmColor);
123
124 /* LOAD_LIBRARY_AS_DATAFILE */
125 test_LoadImage_DataFile();
126
127 return;
128 }
129
130 /* Start child process */
131 sprintf( path, "%s LoadImage %Iu", test_argv[0], (ULONG_PTR)handle );
132 memset( &si, 0, sizeof(si) );
133 si.cb = sizeof(si);
134 CreateProcessA( NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );
135 WaitForSingleObject (pi.hProcess, INFINITE);
136 }
137