source: trunk/src/shlwapi/ordinal.c@ 7502

Last change on this file since 7502 was 7502, checked in by phaller, 24 years ago

Fixed out-of-scope FIXME,TRACE,WARN macros

File size: 29.6 KB
Line 
1/*
2 * SHLWAPI ordinal functions
3 *
4 * Copyright 1997 Marcus Meissner
5 * 1998 Jürgen Schmied
6 * 2001 Jon Griffiths
7 */
8
9#include <stdio.h>
10#include <string.h>
11
12#include "windef.h"
13#include "winnls.h"
14#include "winbase.h"
15#include "ddeml.h"
16#include "shlobj.h"
17#include "shellapi.h"
18#include "commdlg.h"
19#include "wine/unicode.h"
20#include "wine/obj_base.h"
21#include "wingdi.h"
22#include "winuser.h"
23#include "debugtools.h"
24
25DEFAULT_DEBUG_CHANNEL(shell);
26
27#ifdef __WIN32OS2__
28extern HINSTANCE shlwapi_hInstance = 0;
29extern HMODULE SHLWAPI_hshell32 = 0;
30extern HMODULE SHLWAPI_hwinmm = 0;
31extern HMODULE SHLWAPI_hcomdlg32 = 0;
32extern HMODULE SHLWAPI_hmpr = 0;
33extern HMODULE SHLWAPI_hmlang = 0;
34#undef FIXME
35#ifdef DEBUG
36// PH 2001-11-30
37// this macro definition causes the control leave the scope of a
38// non-curly-braced preceeding if statement. Therefore,
39// if (p!=NULL)
40// TRACE("p->a=%d", p->a)
41// crashes.
42//
43// !!! ENSURE TRACES AND FIXMES WITH PRECEEDING IF STATEMENT
44// !!! ARE PUT INTO CURLY BRACES
45#define FIXME WriteLog("FIXME %s", __FUNCTION__); WriteLog
46#else
47#define FIXME 1 ? (void)0 : (void)((int (*)(char *, ...)) NULL)
48#endif
49#else
50extern HINSTANCE shlwapi_hInstance;
51extern HMODULE SHLWAPI_hshell32;
52extern HMODULE SHLWAPI_hwinmm;
53extern HMODULE SHLWAPI_hcomdlg32;
54extern HMODULE SHLWAPI_hmpr;
55extern HMODULE SHLWAPI_hmlang;
56#endif
57
58/* Macro to get function pointer for a module*/
59#define GET_FUNC(module, name, fail) \
60 if (!SHLWAPI_h##module) SHLWAPI_h##module = LoadLibraryA(#module ".dll"); \
61 if (!SHLWAPI_h##module) return fail; \
62 if (!pfnFunc) pfnFunc = (void*)GetProcAddress(SHLWAPI_h##module, name); \
63 if (!pfnFunc) return fail
64
65/*
66 NOTES: Most functions exported by ordinal seem to be superflous.
67 The reason for these functions to be there is to provide a wraper
68 for unicode functions to provide these functions on systems without
69 unicode functions eg. win95/win98. Since we have such functions we just
70 call these. If running Wine with native DLL's, some late bound calls may
71 fail. However, its better to implement the functions in the forward DLL
72 and recommend the builtin rather than reimplementing the calls here!
73*/
74#ifndef __WIN32OS2__
75/*************************************************************************
76 * SHLWAPI_1 [SHLWAPI.1]
77 */
78DWORD WINAPI SHLWAPI_1 (
79 LPSTR lpURL,
80 LPDWORD lpdwFlags)
81{
82 if (lpURL == NULL)
83 return E_INVALIDARG;
84
85 if (lpdwFlags == NULL)
86 return E_INVALIDARG;
87
88 // verify flags
89 if (*lpdwFlags != 0x18) // some unknown flag
90 return E_INVALIDARG; // some unknown error condition
91
92 FIXME("(%p %s %p %s)\n",lpStr, debugstr_a(lpStr),x, debugstr_a(x));
93 return 0;
94}
95
96/*************************************************************************
97 * SHLWAPI_2 [SHLWAPI.2]
98 */
99DWORD WINAPI SHLWAPI_2 (LPCWSTR x,LPVOID y)
100{
101 FIXME("(%s,%p)\n",debugstr_w(x),y);
102 return 0;
103}
104
105/*************************************************************************
106 * SHLWAPI_16 [SHLWAPI.16]
107 */
108HRESULT WINAPI SHLWAPI_16 (
109 LPVOID w,
110 LPVOID x,
111 LPVOID y,
112 LPWSTR z)
113{
114 FIXME("(%p %p %p %p)stub\n",w,x,y,z);
115 return 0xabba1252;
116}
117#endif
118
119/*************************************************************************
120 * SHLWAPI_23 [SHLWAPI.23]
121 *
122 * NOTES
123 * converts a guid to a string
124 * returns strlen(str)
125 */
126DWORD WINAPI SHLWAPI_23 (
127 REFGUID guid, /* [in] clsid */
128 LPSTR str, /* [out] buffer */
129 INT cmax) /* [in] size of buffer */
130{
131 char xguid[40];
132
133 sprintf( xguid, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
134 guid->Data1, guid->Data2, guid->Data3,
135 guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
136 guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
137 TRACE("(%s %p 0x%08x)stub\n", xguid, str, cmax);
138 if (strlen(xguid)>=cmax) return 0;
139 strcpy(str,xguid);
140 return strlen(xguid) + 1;
141}
142
143/*************************************************************************
144 * SHLWAPI_24 [SHLWAPI.24]
145 *
146 * NOTES
147 * converts a guid to a string
148 * returns strlen(str)
149 */
150DWORD WINAPI SHLWAPI_24 (
151 REFGUID guid, /* [in] clsid */
152 LPWSTR str, /* [out] buffer */
153 INT cmax) /* [in] size of buffer */
154{
155 char xguid[40];
156
157 sprintf( xguid, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
158 guid->Data1, guid->Data2, guid->Data3,
159 guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
160 guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
161 return MultiByteToWideChar( CP_ACP, 0, xguid, -1, str, cmax );
162}
163
164/*************************************************************************
165 * SHLWAPI_30 [SHLWAPI.30]
166 *
167 * Seems to be an isspaceW.
168 */
169BOOL WINAPI SHLWAPI_30(LPWSTR lpcChar)
170{
171 switch (*lpcChar)
172 {
173 case (WCHAR)'\t':
174 case (WCHAR)' ':
175 case 160:
176 case 12288:
177 case 65279:
178 return TRUE;
179 }
180 return FALSE;
181}
182
183/*************************************************************************
184 * SHLWAPI_32 [SHLWAPI.32]
185 */
186BOOL WINAPI SHLWAPI_32(LPCWSTR lpcChar)
187{
188 if (*lpcChar < (WCHAR)' ')
189 return TRUE;
190
191 /* This is probably a shlwapi bug, but we do it the same for compatability */
192 if (((DWORD)lpcChar & 0xffff) - 127 <= (WCHAR)' ')
193 return TRUE;
194 return FALSE;
195}
196
197/*************************************************************************
198 * SHLWAPI_40 [SHLWAPI.40]
199 *
200 * Get pointer to next Unicode character.
201 */
202LPCWSTR WINAPI SHLWAPI_40(LPCWSTR str)
203{
204 return *str ? str + 1 : str;
205}
206
207/*************************************************************************
208 * SHLWAPI_74 [SHLWAPI.74]
209 *
210 * Get the text from a given dialog item.
211 */
212INT WINAPI SHLWAPI_74(HWND hWnd, INT nItem, LPWSTR lpsDest,INT nDestLen)
213{
214 HWND hItem = GetDlgItem(hWnd, nItem);
215
216 if (hItem)
217 return GetWindowTextW(hItem, lpsDest, nDestLen);
218 if (nDestLen)
219 *lpsDest = (WCHAR)'\0';
220 return 0;
221}
222/*************************************************************************
223 * SHLWAPI_151 [SHLWAPI.151]
224 */
225#ifdef __WIN32OS2__
226DWORD WINAPI SHLWAPI_151(LPSTR str1, LPSTR str2, INT len)
227{
228 dprintf(("SHLWAPI_151 (strcmpn) %s %s %d", str1, str2, len));
229 if (!len)
230 return 0;
231
232 while (--len && *str1 && *str1 == *str2)
233 {
234 str1++;
235 str2++;
236 }
237 return *str1 - *str2;
238
239}
240#else
241DWORD WINAPI SHLWAPI_151(void)
242{
243 FIXME(": stub\n");
244 return 0;
245}
246#endif
247
248/*************************************************************************
249 * SHLWAPI_152 [SHLWAPI.152]
250 */
251DWORD WINAPI SHLWAPI_152(LPWSTR str1, LPWSTR str2, INT len)
252{
253 if (!len)
254 return 0;
255
256 while (--len && *str1 && *str1 == *str2)
257 {
258 str1++;
259 str2++;
260 }
261 return *str1 - *str2;
262}
263
264/*************************************************************************
265 * SHLWAPI_153 [SHLWAPI.153]
266 */
267#ifdef __WIN32OS2__
268//case insensitive string compare with length (ascii)
269DWORD WINAPI SHLWAPI_153(LPSTR str1, LPSTR str2, DWORD len)
270{
271 if (!len)
272 return 0;
273
274 return lstrncmpiA(str1, str2, len);
275}
276
277//case insensitive string compare with length (unicode)
278DWORD WINAPI SHLWAPI_154(LPWSTR str1, LPWSTR str2, DWORD len)
279{
280 if (!len)
281 return 0;
282
283 return lstrncmpiW(str1, str2, len);
284}
285
286#else
287DWORD WINAPI SHLWAPI_153(DWORD dw1, DWORD dw2, DWORD dw3)
288{
289 FIXME("%08lx %08lx %08lx - stub\n", dw1, dw2, dw3);
290 return 0;
291}
292#endif
293
294/*************************************************************************
295 * SHLWAPI_156 [SHLWAPI.156]
296 *
297 * Case sensitive string compare. Does not SetLastError().
298 */
299DWORD WINAPI SHLWAPI_156 ( LPWSTR str1, LPWSTR str2)
300{
301 while (*str1 && (*str1 == *str2)) { str1++; str2++; }
302 return (INT)(*str1 - *str2);
303}
304
305/*************************************************************************
306 * SHLWAPI_162 [SHLWAPI.162]
307 *
308 * Ensure a multibyte character string doesn't end in a hanging lead byte.
309 */
310DWORD WINAPI SHLWAPI_162(LPSTR lpStr, DWORD size)
311{
312 if (lpStr && size)
313 {
314 LPSTR lastByte = lpStr + size - 1;
315
316 while(lpStr < lastByte)
317 lpStr += IsDBCSLeadByte(*lpStr) ? 2 : 1;
318
319 if(lpStr == lastByte && IsDBCSLeadByte(*lpStr))
320 {
321 *lpStr = '\0';
322 size--;
323 }
324 return size;
325 }
326 return 0;
327}
328
329/*************************************************************************
330 * SHLWAPI_165 [SHLWAPI.165]
331 *
332 * SetWindowLongA with mask.
333 */
334LONG WINAPI SHLWAPI_165(HWND hwnd, INT offset, UINT wFlags, UINT wMask)
335{
336 LONG ret = GetWindowLongA(hwnd, offset);
337 UINT newFlags = (wFlags & wMask) | (ret & ~wFlags);
338
339 if (newFlags != ret)
340 ret = SetWindowLongA(hwnd, offset, newFlags);
341 return ret;
342}
343
344/*************************************************************************
345 * SHLWAPI_169 [SHLWAPI.169]
346 */
347DWORD WINAPI SHLWAPI_169 (IUnknown * lpUnknown)
348{
349 TRACE("(%p)\n",lpUnknown);
350#if 0
351 if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0;
352 return IUnknown_Release(lpUnknown);
353#endif
354 return 0;
355}
356
357/*************************************************************************
358 * SHLWAPI_170 [SHLWAPI.170]
359 *
360 * Skip URL '//' sequence.
361 */
362LPCSTR WINAPI SHLWAPI_170(LPCSTR lpszSrc)
363{
364 if (lpszSrc && lpszSrc[0] == '/' && lpszSrc[1] == '/')
365 lpszSrc += 2;
366 return lpszSrc;
367}
368
369/*************************************************************************
370 * SHLWAPI_181 [SHLWAPI.181]
371 *
372 * Enable or disable a menu item.
373 */
374UINT WINAPI SHLWAPI_181(HMENU hMenu, UINT wItemID, BOOL bEnable)
375{
376 return EnableMenuItem(hMenu, wItemID, bEnable ? MF_ENABLED : MF_GRAYED);
377}
378
379/*************************************************************************
380 * SHLWAPI_183 [SHLWAPI.183]
381 *
382 * Register a window class if it isn't already.
383 */
384DWORD WINAPI SHLWAPI_183(WNDCLASSA *wndclass)
385{
386 WNDCLASSA wca;
387 if (GetClassInfoA(wndclass->hInstance, wndclass->lpszClassName, &wca))
388 return TRUE;
389 return (DWORD)RegisterClassA(wndclass);
390}
391
392/*************************************************************************
393 * SHLWAPI_193 [SHLWAPI.193]
394 */
395DWORD WINAPI SHLWAPI_193 ()
396{
397 HDC hdc;
398 DWORD ret;
399
400 TRACE("()\n");
401
402 hdc = GetDC(0);
403 ret = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
404 ReleaseDC(0, hdc);
405 return ret;
406}
407
408/*************************************************************************
409 * SHLWAPI_215 [SHLWAPI.215]
410 *
411 * NOTES
412 * check me!
413 */
414LPWSTR WINAPI SHLWAPI_215 (
415 LPWSTR lpStrSrc,
416 LPVOID lpwStrDest,
417 int len)
418{
419 WARN("(%p %p %u)\n",lpStrSrc,lpwStrDest,len);
420 return strncpyW(lpwStrDest, lpStrSrc, len);
421}
422
423/*************************************************************************
424 * SHLWAPI_218 [SHLWAPI.218]
425 *
426 * WideCharToMultiByte with multi language support.
427 */
428INT WINAPI SHLWAPI_218(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
429 LPINT lpnMultiCharCount)
430{
431#ifdef __WIN32OS2__
432 static HRESULT (* WINAPI pfnFunc)(LPDWORD,DWORD,LPCWSTR,LPINT,LPSTR,LPINT);
433#else
434 static HRESULT (* WINAPI pfnFunc)(LPDWORD,DWORD,LPCWSTR,LPINT,LPSTR,LPINT);
435#endif
436 WCHAR emptyW[] = { '\0' };
437 int len , reqLen;
438 LPSTR mem;
439
440 if (!lpDstStr || !lpnMultiCharCount)
441 return 0;
442
443 if (!lpSrcStr)
444 lpSrcStr = emptyW;
445
446 *lpDstStr = '\0';
447
448 len = strlenW(lpSrcStr) + 1;
449
450 switch (CodePage)
451 {
452 case CP_WINUNICODE:
453 CodePage = CP_UTF8; /* Fall through... */
454 case 0x0000C350: /* FIXME: CP_ #define */
455 case CP_UTF7:
456 case CP_UTF8:
457 {
458 DWORD dwMode = 0;
459 INT nWideCharCount = len - 1;
460
461 GET_FUNC(mlang, "ConvertINetUnicodeToMultiByte", 0);
462 if (!pfnFunc(&dwMode, CodePage, lpSrcStr, &nWideCharCount, lpDstStr,
463 lpnMultiCharCount))
464 return 0;
465
466 if (nWideCharCount < len - 1)
467 {
468 mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, *lpnMultiCharCount);
469 if (!mem)
470 return 0;
471
472 *lpnMultiCharCount = 0;
473
474 if (pfnFunc(&dwMode, CodePage, lpSrcStr, &len, mem, lpnMultiCharCount))
475 {
476 SHLWAPI_162 (mem, *lpnMultiCharCount);
477 lstrcpynA(lpDstStr, mem, *lpnMultiCharCount + 1);
478 return *lpnMultiCharCount + 1;
479 }
480 HeapFree(GetProcessHeap(), 0, mem);
481 return *lpnMultiCharCount;
482 }
483 lpDstStr[*lpnMultiCharCount] = '\0';
484 return *lpnMultiCharCount;
485 }
486 break;
487 default:
488 break;
489 }
490
491 reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr,
492 *lpnMultiCharCount, NULL, NULL);
493
494 if (!reqLen && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
495 {
496 reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, NULL, 0, NULL, NULL);
497 if (reqLen)
498 {
499 mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, reqLen);
500 if (mem)
501 {
502 reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem,
503 reqLen, NULL, NULL);
504
505 reqLen = SHLWAPI_162(mem, *lpnMultiCharCount);
506 reqLen++;
507
508 lstrcpynA(lpDstStr, mem, *lpnMultiCharCount);
509
510 HeapFree(GetProcessHeap(), 0, mem);
511 }
512 }
513 }
514 return reqLen;
515}
516
517/*************************************************************************
518 * SHLWAPI_217 [SHLWAPI.217]
519 *
520 */
521INT WINAPI SHLWAPI_217(LPCWSTR lpSrcStr, LPSTR lpDstStr, LPINT lpnMultiCharCount)
522{
523 return SHLWAPI_218(CP_ACP, lpSrcStr, lpDstStr, lpnMultiCharCount);
524}
525
526#ifndef __WIN32OS2__
527/*************************************************************************
528 * SHLWAPI_219 [SHLWAPI.219]
529 *
530 * NOTES
531 * error codes: E_POINTER, E_NOINTERFACE
532 */
533HRESULT WINAPI SHLWAPI_219 (
534 LPVOID w, /* [???] NOTE: returned by LocalAlloc, 0x450 bytes, iface */
535 LPVOID x,
536 REFIID riid,
537 LPWSTR z) /* [???] NOTE: OUT: path */
538{
539 FIXME("(%p %p %s %p)stub\n",w,x,debugstr_guid(riid),z);
540 return 0xabba1252;
541}
542#endif
543
544/*************************************************************************
545 * SHLWAPI_222 [SHLWAPI.222]
546 *
547 * NOTES
548 * securityattributes missing
549 */
550HANDLE WINAPI SHLWAPI_222 (LPCLSID guid)
551{
552 char lpstrName[80];
553
554 sprintf( lpstrName, "shell.{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
555 guid->Data1, guid->Data2, guid->Data3,
556 guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
557 guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
558 FIXME("(%s) stub\n", lpstrName);
559 return CreateSemaphoreA(NULL,0, 0x7fffffff, lpstrName);
560}
561
562/*************************************************************************
563 * SHLWAPI_223 [SHLWAPI.223]
564 *
565 * NOTES
566 * get the count of the semaphore
567 */
568DWORD WINAPI SHLWAPI_223 (HANDLE handle)
569{
570 DWORD oldCount;
571
572 FIXME("(0x%08x) stub\n",handle);
573
574 ReleaseSemaphore( handle, 1, &oldCount); /* +1 */
575 WaitForSingleObject( handle, 0 ); /* -1 */
576 return oldCount;
577}
578
579/*************************************************************************
580 * SHLWAPI_237 [SHLWAPI.237]
581 *
582 * Unicode version of SHLWAPI_183.
583 */
584DWORD WINAPI SHLWAPI_237 (WNDCLASSW * lpWndClass)
585{
586 WNDCLASSW WndClass;
587
588 TRACE("(0x%08x %s)\n",lpWndClass->hInstance, debugstr_w(lpWndClass->lpszClassName));
589
590 if (GetClassInfoW(lpWndClass->hInstance, lpWndClass->lpszClassName, &WndClass))
591 return TRUE;
592 return RegisterClassW(lpWndClass);
593}
594
595/*************************************************************************
596 * SHLWAPI_240 [SHLWAPI.240]
597 *
598 * Calls ASCII or Unicode WindowProc for the given window.
599 */
600LRESULT CALLBACK SHLWAPI_240(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
601{
602 if (IsWindowUnicode(hWnd))
603 return DefWindowProcW(hWnd, uMessage, wParam, lParam);
604 return DefWindowProcA(hWnd, uMessage, wParam, lParam);
605}
606#ifndef __WIN32OS2__
607/*************************************************************************
608 * SHLWAPI_241 [SHLWAPI.241]
609 *
610 */
611DWORD WINAPI SHLWAPI_241 ()
612{
613 FIXME("()stub\n");
614 return 0xabba1243;
615}
616
617/*************************************************************************
618 * SHLWAPI_266 [SHLWAPI.266]
619 */
620DWORD WINAPI SHLWAPI_266 (
621 LPVOID w,
622 LPVOID x,
623 LPVOID y,
624 LPVOID z)
625{
626 FIXME("(%p %p %p %p)stub\n",w,x,y,z);
627 return 0xabba1248;
628}
629
630/*************************************************************************
631 * SHLWAPI_267 [SHLWAPI.267]
632 */
633HRESULT WINAPI SHLWAPI_267 (
634 LPVOID w, /* [???] NOTE: same as 1th parameter of SHLWAPI_219 */
635 LPVOID x, /* [???] NOTE: same as 2nd parameter of SHLWAPI_219 */
636 LPVOID y,
637 LPVOID z)
638{
639 FIXME("(%p %p %p %p)stub\n",w,x,y,z);
640 *((LPDWORD)z) = 0xabba1200;
641 return 0xabba1254;
642}
643
644/*************************************************************************
645 * SHLWAPI_268 [SHLWAPI.268]
646 */
647DWORD WINAPI SHLWAPI_268 (
648 LPVOID w,
649 LPVOID x)
650{
651 FIXME("(%p %p)\n",w,x);
652 return 0xabba1251; /* 0 = failure */
653}
654
655/*************************************************************************
656 * SHLWAPI_276 [SHLWAPI.276]
657 *
658 */
659DWORD WINAPI SHLWAPI_276 ()
660{
661 FIXME("()stub\n");
662 return 0xabba1244;
663}
664#endif
665/*************************************************************************
666 * SHLWAPI_278 [SHLWAPI.278]
667 *
668 */
669DWORD WINAPI SHLWAPI_278 (
670 LONG wndProc,
671 HWND hWndParent,
672 DWORD dwExStyle,
673 DWORD dwStyle,
674 HMENU hMenu,
675 LONG z)
676{
677 WNDCLASSA wndclass;
678 HWND hwnd;
679 HCURSOR hCursor;
680 char * clsname = "WorkerA";
681
682 FIXME("(0x%08lx 0x%08x 0x%08lx 0x%08lx 0x%08x 0x%08lx)stub\n",
683 wndProc,hWndParent,dwExStyle,dwStyle,hMenu,z);
684
685 hCursor = LoadCursorA(0x00000000,IDC_ARROWA);
686
687 if(!GetClassInfoA(shlwapi_hInstance, clsname, &wndclass))
688 {
689 RtlZeroMemory(&wndclass, sizeof(WNDCLASSA));
690 wndclass.lpfnWndProc = DefWindowProcW;
691 wndclass.cbWndExtra = 4;
692 wndclass.hInstance = shlwapi_hInstance;
693 wndclass.hCursor = hCursor;
694 wndclass.hbrBackground = COLOR_BTNSHADOW;
695 wndclass.lpszMenuName = NULL;
696 wndclass.lpszClassName = clsname;
697 RegisterClassA (&wndclass);
698 }
699 hwnd = CreateWindowExA(dwExStyle, clsname, 0,dwStyle,0,0,0,0,hWndParent,
700 hMenu,shlwapi_hInstance,0);
701 SetWindowLongA(hwnd, 0, z);
702 SetWindowLongA(hwnd, GWL_WNDPROC, wndProc);
703 return hwnd;
704}
705
706/*************************************************************************
707 * SHLWAPI_289 [SHLWAPI.289]
708 *
709 * Late bound call to winmm.PlaySoundW
710 */
711BOOL WINAPI SHLWAPI_289(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
712{
713 static BOOL (* WINAPI pfnFunc)(LPCWSTR, HMODULE, DWORD) = NULL;
714
715 GET_FUNC(winmm, "PlaySoundW", FALSE);
716 return pfnFunc(pszSound, hmod, fdwSound);
717}
718
719/*************************************************************************
720 * SHLWAPI_313 [SHLWAPI.313]
721 *
722 * Late bound call to shell32.SHGetFileInfoW
723 */
724DWORD WINAPI SHLWAPI_313(LPCWSTR path, DWORD dwFileAttributes,
725 SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
726{
727 static DWORD (* WINAPI pfnFunc)(LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT) = NULL;
728
729 GET_FUNC(shell32, "SHGetFileInfoW", 0);
730 return pfnFunc(path, dwFileAttributes, psfi, sizeofpsfi, flags);
731}
732
733/*************************************************************************
734 * SHLWAPI_318 [SHLWAPI.318]
735 *
736 * Late bound call to shell32.DragQueryFileW
737 */
738UINT WINAPI SHLWAPI_318(HDROP hDrop, UINT lFile, LPWSTR lpszFile, UINT lLength)
739{
740 static UINT (* WINAPI pfnFunc)(HDROP, UINT, LPWSTR, UINT) = NULL;
741
742 GET_FUNC(shell32, "DragQueryFileW", 0);
743 return pfnFunc(hDrop, lFile, lpszFile, lLength);
744}
745
746/*************************************************************************
747 * SHLWAPI_333 [SHLWAPI.333]
748 *
749 * Late bound call to shell32.SHBrowseForFolderW
750 */
751LPITEMIDLIST WINAPI SHLWAPI_333(LPBROWSEINFOW lpBi)
752{
753 static LPITEMIDLIST (* WINAPI pfnFunc)(LPBROWSEINFOW) = NULL;
754
755 GET_FUNC(shell32, "SHBrowseForFolderW", NULL);
756 return pfnFunc(lpBi);
757}
758
759/*************************************************************************
760 * SHLWAPI_334 [SHLWAPI.334]
761 *
762 * Late bound call to shell32.SHGetPathFromIDListW
763 */
764BOOL WINAPI SHLWAPI_334(LPCITEMIDLIST pidl,LPWSTR pszPath)
765{
766 static BOOL (* WINAPI pfnFunc)(LPCITEMIDLIST, LPWSTR) = NULL;
767
768 GET_FUNC(shell32, "SHGetPathFromIDListW", 0);
769 return pfnFunc(pidl, pszPath);
770}
771
772/*************************************************************************
773 * SHLWAPI_335 [SHLWAPI.335]
774 *
775 * Late bound call to shell32.ShellExecuteExW
776 */
777BOOL WINAPI SHLWAPI_335(LPSHELLEXECUTEINFOW lpExecInfo)
778{
779 static BOOL (* WINAPI pfnFunc)(LPSHELLEXECUTEINFOW) = NULL;
780
781 GET_FUNC(shell32, "ShellExecuteExW", FALSE);
782 return pfnFunc(lpExecInfo);
783}
784
785/*************************************************************************
786 * SHLWAPI_336 [SHLWAPI.336]
787 *
788 * Late bound call to shell32.SHFileOperationW.
789 */
790DWORD WINAPI SHLWAPI_336(LPSHFILEOPSTRUCTW lpFileOp)
791{
792 static HICON (* WINAPI pfnFunc)(LPSHFILEOPSTRUCTW) = NULL;
793
794 GET_FUNC(shell32, "SHFileOperationW", 0);
795 return pfnFunc(lpFileOp);
796}
797
798/*************************************************************************
799 * SHLWAPI_337 [SHLWAPI.337]
800 *
801 * Late bound call to shell32.ExtractIconExW.
802 */
803HICON WINAPI SHLWAPI_337(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge,
804 HICON *phiconSmall, UINT nIcons)
805{
806 static HICON (* WINAPI pfnFunc)(LPCWSTR, INT,HICON *,HICON *, UINT) = NULL;
807
808 GET_FUNC(shell32, "ExtractIconExW", (HICON)0);
809 return pfnFunc(lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
810}
811#ifndef __WIN32OS2__
812//Bugbug: is forwarder for InterlockedCompareExchange
813/*************************************************************************
814 * SHLWAPI_342 [SHLWAPI.342]
815 *
816 */
817DWORD WINAPI SHLWAPI_342 (
818 LPVOID w,
819 LPVOID x,
820 LPVOID y,
821 LPVOID z)
822{
823 FIXME("(%p %p %p %p)stub\n",w,x,y,z);
824 return 0xabba1249;
825}
826#endif
827/*************************************************************************
828 * SHLWAPI_346 [SHLWAPI.346]
829 */
830DWORD WINAPI SHLWAPI_346 (
831 LPCWSTR src,
832 LPWSTR dest,
833 int len)
834{
835 FIXME("(%s %p 0x%08x)stub\n",debugstr_w(src),dest,len);
836 lstrcpynW(dest, src, len);
837 return lstrlenW(dest)+1;
838}
839
840/*************************************************************************
841 * SHLWAPI_357 [SHLWAPI.357]
842 *
843 * Late bound call to shell32.SHGetNewLinkInfoW
844 */
845BOOL WINAPI SHLWAPI_357(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName,
846 BOOL *pfMustCopy, UINT uFlags)
847{
848 static BOOL (* WINAPI pfnFunc)(LPCWSTR, LPCWSTR, LPCWSTR, BOOL*, UINT) = NULL;
849
850 GET_FUNC(shell32, "SHGetNewLinkInfoW", FALSE);
851 return pfnFunc(pszLinkTo, pszDir, pszName, pfMustCopy, uFlags);
852}
853
854/*************************************************************************
855 * SHLWAPI_358 [SHLWAPI.358]
856 *
857 * Late bound call to shell32.SHDefExtractIconW
858 */
859DWORD WINAPI SHLWAPI_358(LPVOID arg1, LPVOID arg2, LPVOID arg3, LPVOID arg4,
860 LPVOID arg5, LPVOID arg6)
861{
862 /* FIXME: Correct args */
863 static DWORD (* WINAPI pfnFunc)(LPVOID, LPVOID, LPVOID, LPVOID, LPVOID, LPVOID) = NULL;
864
865 GET_FUNC(shell32, "SHDefExtractIconW", 0);
866 return pfnFunc(arg1, arg2, arg3, arg4, arg5, arg6);
867}
868
869/*************************************************************************
870 * SHLWAPI_364 [SHLWAPI.364]
871 *
872 * Wrapper for lstrcpynA with src and dst swapped.
873 */
874DWORD WINAPI SHLWAPI_364(LPCSTR src, LPSTR dst, INT n)
875{
876 lstrcpynA(dst, src, n);
877 return TRUE;
878}
879
880/*************************************************************************
881 * SHLWAPI_370 [SHLWAPI.370]
882 *
883 * Late bound call to shell32.ExtractIconW
884 */
885HICON WINAPI SHLWAPI_370(HINSTANCE hInstance, LPCWSTR lpszExeFileName,
886 UINT nIconIndex)
887{
888 static HICON (* WINAPI pfnFunc)(HINSTANCE, LPCWSTR, UINT) = NULL;
889
890 GET_FUNC(shell32, "ExtractIconW", (HICON)0);
891 return pfnFunc(hInstance, lpszExeFileName, nIconIndex);
892}
893
894/*************************************************************************
895 * SHLWAPI_376 [SHLWAPI.376]
896 */
897DWORD WINAPI SHLWAPI_376 (LONG x)
898{
899 FIXME("(0x%08lx)stub\n", x );
900 /* FIXME: This should be a forward in the .spec file to the win2k function
901 * kernel32.GetUserDefaultUILanguage, however that function isn't there yet.
902 */
903 return 0xabba1245;
904}
905#ifndef __WIN32OS2__
906/*************************************************************************
907 * SHLWAPI_377 [SHLWAPI.377]
908 */
909DWORD WINAPI SHLWAPI_377 (LPVOID x, LPVOID y, LPVOID z)
910{
911 FIXME("(%p %p %p)stub\n", x,y,z);
912 return 0xabba1246;
913}
914#endif
915/*************************************************************************
916 * SHLWAPI_378 [SHLWAPI.378]
917 */
918DWORD WINAPI SHLWAPI_378 (
919 LPSTR x,
920 LPVOID y, /* [???] 0x50000000 */
921 LPVOID z) /* [???] 4 */
922{
923 FIXME("(%s %p %p)stub\n", x,y,z);
924 return LoadLibraryA(x);
925}
926
927/*************************************************************************
928 * SHLWAPI_389 [SHLWAPI.389]
929 *
930 * Late bound call to comdlg32.GetSaveFileNameW
931 */
932BOOL WINAPI SHLWAPI_389(LPOPENFILENAMEW ofn)
933{
934 static BOOL (* WINAPI pfnFunc)(LPOPENFILENAMEW) = NULL;
935
936 GET_FUNC(comdlg32, "GetSaveFileNameW", FALSE);
937 return pfnFunc(ofn);
938}
939
940/*************************************************************************
941 * SHLWAPI_390 [SHLWAPI.390]
942 *
943 * Late bound call to mpr.WNetRestoreConnectionW
944 */
945DWORD WINAPI SHLWAPI_390(LPVOID arg1, LPVOID arg2)
946{
947 /* FIXME: Correct args */
948 static DWORD (* WINAPI pfnFunc)(LPVOID, LPVOID) = NULL;
949
950 GET_FUNC(mpr, "WNetRestoreConnectionW", 0);
951 return pfnFunc(arg1, arg2);
952}
953
954/*************************************************************************
955 * SHLWAPI_391 [SHLWAPI.391]
956 *
957 * Late bound call to mpr.WNetGetLastErrorW
958 */
959DWORD WINAPI SHLWAPI_391(LPVOID arg1, LPVOID arg2, LPVOID arg3, LPVOID arg4,
960 LPVOID arg5)
961{
962 /* FIXME: Correct args */
963 static DWORD (* WINAPI pfnFunc)(LPVOID, LPVOID, LPVOID, LPVOID, LPVOID) = NULL;
964
965 GET_FUNC(mpr, "WNetGetLastErrorW", 0);
966 return pfnFunc(arg1, arg2, arg3, arg4, arg5);
967}
968
969/*************************************************************************
970 * SHLWAPI_401 [SHLWAPI.401]
971 *
972 * Late bound call to comdlg32.PageSetupDlgW
973 */
974BOOL WINAPI SHLWAPI_401(LPPAGESETUPDLGW pagedlg)
975{
976 static BOOL (* WINAPI pfnFunc)(LPPAGESETUPDLGW) = NULL;
977
978 GET_FUNC(comdlg32, "PageSetupDlgW", FALSE);
979 return pfnFunc(pagedlg);
980}
981
982/*************************************************************************
983 * SHLWAPI_402 [SHLWAPI.402]
984 *
985 * Late bound call to comdlg32.PrintDlgW
986 */
987BOOL WINAPI SHLWAPI_402(LPPRINTDLGW printdlg)
988{
989 static BOOL (* WINAPI pfnFunc)(LPPRINTDLGW) = NULL;
990
991 GET_FUNC(comdlg32, "PrintDlgW", FALSE);
992 return pfnFunc(printdlg);
993}
994
995/*************************************************************************
996 * SHLWAPI_403 [SHLWAPI.403]
997 *
998 * Late bound call to comdlg32.GetOpenFileNameW
999 */
1000BOOL WINAPI SHLWAPI_403(LPOPENFILENAMEW ofn)
1001{
1002 static BOOL (* WINAPI pfnFunc)(LPOPENFILENAMEW) = NULL;
1003
1004 GET_FUNC(comdlg32, "GetOpenFileNameW", FALSE);
1005 return pfnFunc(ofn);
1006}
1007
1008/* INTERNAL: Map from HLS color space to RGB */
1009static WORD ConvertHue(int wHue, WORD wMid1, WORD wMid2)
1010{
1011 wHue = wHue > 240 ? wHue - 240 : wHue < 0 ? wHue + 240 : wHue;
1012
1013 if (wHue > 160)
1014 return wMid1;
1015 else if (wHue > 120)
1016 wHue = 160 - wHue;
1017 else if (wHue > 40)
1018 return wMid2;
1019
1020 return ((wHue * (wMid2 - wMid1) + 20) / 40) + wMid1;
1021}
1022
1023/* Convert to RGB and scale into RGB range (0..255) */
1024#define GET_RGB(h) (ConvertHue(h, wMid1, wMid2) * 255 + 120) / 240
1025
1026/*************************************************************************
1027 * ColorHLSToRGB [SHLWAPI.404]
1028 *
1029 * Convert from HLS color space into an RGB COLORREF.
1030 *
1031 * NOTES
1032 * Input HLS values are constrained to the range (0..240).
1033 */
1034COLORREF WINAPI ColorHLSToRGB(WORD wHue, WORD wLuminosity, WORD wSaturation)
1035{
1036 WORD wRed;
1037
1038 if (wSaturation)
1039 {
1040 WORD wGreen, wBlue, wMid1, wMid2;
1041
1042 if (wLuminosity > 120)
1043 wMid2 = wSaturation + wLuminosity - (wSaturation * wLuminosity + 120) / 240;
1044 else
1045 wMid2 = ((wSaturation + 240) * wLuminosity + 120) / 240;
1046
1047 wMid1 = wLuminosity * 2 - wMid2;
1048
1049 wRed = GET_RGB(wHue + 80);
1050 wGreen = GET_RGB(wHue);
1051 wBlue = GET_RGB(wHue - 80);
1052
1053 return RGB(wRed, wGreen, wBlue);
1054 }
1055
1056 wRed = wLuminosity * 255 / 240;
1057 return RGB(wRed, wRed, wRed);
1058}
1059
1060/*************************************************************************
1061 * SHLWAPI_431 [SHLWAPI.431]
1062 */
1063DWORD WINAPI SHLWAPI_431 (DWORD x)
1064{
1065 FIXME("(0x%08lx)stub\n", x);
1066 return 0xabba1247;
1067}
1068
1069#ifndef __WIN32OS2__
1070/*************************************************************************
1071 * SHLWAPI_437 [SHLWAPI.437]
1072 *
1073 * NOTES
1074 * In the real shlwapi, One time initilisation calls GetVersionEx and reads
1075 * the registry to determine what O/S & Service Pack level is running, and
1076 * therefore which functions are available. Currently we always run as NT,
1077 * since this means that we don't need extra code to emulate Unicode calls,
1078 * they are forwarded directly to the appropriate API call instead.
1079 * Since the flags for whether to call or emulate Unicode are internal to
1080 * the dll, this function does not need a full implementation.
1081 */
1082DWORD WINAPI SHLWAPI_437 (DWORD functionToCall)
1083{
1084 FIXME("(0x%08lx)stub\n", functionToCall);
1085 return 0xabba1247;
1086}
1087#endif
1088
1089/*************************************************************************
1090 * SHCreateShellPalette [SHLWAPI.@]
1091 */
1092HPALETTE WINAPI SHCreateShellPalette(HDC hdc)
1093{
1094 FIXME("stub\n");
1095 return CreateHalftonePalette(hdc);
1096}
1097
1098/*************************************************************************
1099 * SHGetInverseCMAP
1100 */
1101DWORD WINAPI SHGetInverseCMAP (LPVOID x, DWORD why)
1102{
1103 FIXME("(%p, %#lx)stub\n", x, why);
1104 return 0;
1105}
1106#ifndef __WIN32OS2__
1107/*************************************************************************
1108 * SHIsLowMemoryMachine [SHLWAPI.@]
1109 */
1110DWORD WINAPI SHIsLowMemoryMachine (DWORD x)
1111{
1112 FIXME("0x%08lx\n", x);
1113 return 0;
1114}
1115#endif
1116
1117/*************************************************************************
1118 * GetMenuPosFromID [SHLWAPI.@]
1119 */
1120INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID)
1121{
1122 MENUITEMINFOA mi;
1123 INT nCount = GetMenuItemCount(hMenu), nIter = 0;
1124
1125 while (nIter < nCount)
1126 {
1127 mi.wID = 0;
1128 if (!GetMenuItemInfoA(hMenu, nIter, TRUE, &mi) && mi.wID == wID)
1129 return nIter;
1130 nIter++;
1131 }
1132 return -1;
1133}
1134
1135/*************************************************************************
1136 * _SHGetInstanceExplorer [SHLWAPI.@]
1137 *
1138 * Late bound call to shell32.SHGetInstanceExplorer.
1139 */
1140HRESULT WINAPI _SHGetInstanceExplorer (LPUNKNOWN *lpUnknown)
1141{
1142 static HRESULT (* WINAPI pfnFunc)(LPUNKNOWN *) = NULL;
1143
1144 GET_FUNC(shell32, "SHGetInstanceExplorer", E_FAIL);
1145 return pfnFunc(lpUnknown);
1146}
Note: See TracBrowser for help on using the repository browser.