2 * SHLWAPI ordinal functions
4 * Copyright 1997 Marcus Meissner
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include "wine/port.h"
38 #include "wine/unicode.h"
39 #include "wine/obj_serviceprovider.h"
40 #include "wine/obj_control.h"
41 #include "wine/obj_connection.h"
42 #include "wine/obj_property.h"
46 #include "wine/debug.h"
50 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
52 /* Get a function pointer from a DLL handle */
53 #define GET_FUNC(func, module, name, fail) \
56 if (!SHLWAPI_h##module && !(SHLWAPI_h##module = LoadLibraryA(#module ".dll"))) return fail; \
57 if (!(func = (void*)GetProcAddress(SHLWAPI_h##module, name))) return fail; \
61 /* DLL handles for late bound calls */
62 extern HINSTANCE shlwapi_hInstance
;
63 extern HMODULE SHLWAPI_hshell32
;
64 extern HMODULE SHLWAPI_hwinmm
;
65 extern HMODULE SHLWAPI_hcomdlg32
;
66 extern HMODULE SHLWAPI_hcomctl32
;
67 extern HMODULE SHLWAPI_hmpr
;
68 extern HMODULE SHLWAPI_hmlang
;
69 extern HMODULE SHLWAPI_hversion
;
71 extern DWORD SHLWAPI_ThreadRef_index
;
73 typedef HANDLE HSHARED
; /* Shared memory */
75 /* following is GUID for IObjectWithSite::SetSite -- see _174 */
76 static DWORD id1
[4] = {0xfc4801a3, 0x11cf2ba9, 0xaa0029a2, 0x52733d00};
77 /* following is GUID for IPersistMoniker::GetClassID -- see _174 */
78 static DWORD id2
[4] = {0x79eac9ee, 0x11cebaf9, 0xaa00828c, 0x0ba94b00};
80 /* Function pointers for GET_FUNC macro; these need to be global because of gcc bug */
81 static LPITEMIDLIST (WINAPI
*pSHBrowseForFolderW
)(LPBROWSEINFOW
);
82 static HRESULT (WINAPI
*pConvertINetUnicodeToMultiByte
)(LPDWORD
,DWORD
,LPCWSTR
,LPINT
,LPSTR
,LPINT
);
83 static BOOL (WINAPI
*pPlaySoundW
)(LPCWSTR
, HMODULE
, DWORD
);
84 static DWORD (WINAPI
*pSHGetFileInfoW
)(LPCWSTR
,DWORD
,SHFILEINFOW
*,UINT
,UINT
);
85 static UINT (WINAPI
*pDragQueryFileW
)(HDROP
, UINT
, LPWSTR
, UINT
);
86 static BOOL (WINAPI
*pSHGetPathFromIDListW
)(LPCITEMIDLIST
, LPWSTR
);
87 static BOOL (WINAPI
*pShellExecuteExW
)(LPSHELLEXECUTEINFOW
);
88 static HICON (WINAPI
*pSHFileOperationW
)(LPSHFILEOPSTRUCTW
);
89 static UINT (WINAPI
*pExtractIconExW
)(LPCWSTR
, INT
,HICON
*,HICON
*, UINT
);
90 static BOOL (WINAPI
*pSHGetNewLinkInfoW
)(LPCWSTR
, LPCWSTR
, LPCWSTR
, BOOL
*, UINT
);
91 static HRESULT (WINAPI
*pSHDefExtractIconW
)(LPCWSTR
, int, UINT
, HICON
*, HICON
*, UINT
);
92 static HICON (WINAPI
*pExtractIconW
)(HINSTANCE
, LPCWSTR
, UINT
);
93 static BOOL (WINAPI
*pGetSaveFileNameW
)(LPOPENFILENAMEW
);
94 static DWORD (WINAPI
*pWNetRestoreConnectionW
)(HWND
, LPWSTR
);
95 static DWORD (WINAPI
*pWNetGetLastErrorW
)(LPDWORD
, LPWSTR
, DWORD
, LPWSTR
, DWORD
);
96 static BOOL (WINAPI
*pPageSetupDlgW
)(LPPAGESETUPDLGW
);
97 static BOOL (WINAPI
*pPrintDlgW
)(LPPRINTDLGW
);
98 static BOOL (WINAPI
*pGetOpenFileNameW
)(LPOPENFILENAMEW
);
99 static DWORD (WINAPI
*pGetFileVersionInfoSizeW
)(LPCWSTR
,LPDWORD
);
100 static BOOL (WINAPI
*pGetFileVersionInfoW
)(LPCWSTR
,DWORD
,DWORD
,LPVOID
);
101 static WORD (WINAPI
*pVerQueryValueW
)(LPVOID
,LPCWSTR
,LPVOID
*,UINT
*);
102 static BOOL (WINAPI
*pCOMCTL32_417
)(HDC
,INT
,INT
,UINT
,const RECT
*,LPCWSTR
,UINT
,const INT
*);
103 static HRESULT (WINAPI
*pDllGetVersion
)(DLLVERSIONINFO
*);
106 NOTES: Most functions exported by ordinal seem to be superflous.
107 The reason for these functions to be there is to provide a wrapper
108 for unicode functions to provide these functions on systems without
109 unicode functions eg. win95/win98. Since we have such functions we just
110 call these. If running Wine with native DLL's, some late bound calls may
111 fail. However, its better to implement the functions in the forward DLL
112 and recommend the builtin rather than reimplementing the calls here!
115 /*************************************************************************
116 * SHLWAPI_DupSharedHandle
118 * Internal implemetation of SHLWAPI_11.
121 HSHARED WINAPI
SHLWAPI_DupSharedHandle(HSHARED hShared
, DWORD dwDstProcId
,
122 DWORD dwSrcProcId
, DWORD dwAccess
,
126 DWORD dwMyProcId
= GetCurrentProcessId();
127 HSHARED hRet
= (HSHARED
)NULL
;
129 TRACE("(%p,%ld,%ld,%08lx,%08lx)\n", (PVOID
)hShared
, dwDstProcId
, dwSrcProcId
,
130 dwAccess
, dwOptions
);
132 /* Get dest process handle */
133 if (dwDstProcId
== dwMyProcId
)
134 hDst
= GetCurrentProcess();
136 hDst
= OpenProcess(PROCESS_DUP_HANDLE
, 0, dwDstProcId
);
140 /* Get src process handle */
141 if (dwSrcProcId
== dwMyProcId
)
142 hSrc
= GetCurrentProcess();
144 hSrc
= OpenProcess(PROCESS_DUP_HANDLE
, 0, dwSrcProcId
);
148 /* Make handle available to dest process */
149 if (!DuplicateHandle(hDst
, (HANDLE
)hShared
, hSrc
, &hRet
,
150 dwAccess
, 0, dwOptions
| DUPLICATE_SAME_ACCESS
))
151 hRet
= (HSHARED
)NULL
;
153 if (dwSrcProcId
!= dwMyProcId
)
157 if (dwDstProcId
!= dwMyProcId
)
161 TRACE("Returning handle %p\n", (PVOID
)hRet
);
165 /*************************************************************************
168 * Create a block of sharable memory and initialise it with data.
171 * dwProcId [I] ID of process owning data
172 * lpvData [I] Pointer to data to write
173 * dwSize [I] Size of data
176 * Success: A shared memory handle
180 * Ordinals 7-11 provide a set of calls to create shared memory between a
181 * group of processes. The shared memory is treated opaquely in that its size
182 * is not exposed to clients who map it. This is accomplished by storing
183 * the size of the map as the first DWORD of mapped data, and then offsetting
184 * the view pointer returned by this size.
186 * SHLWAPI_7/SHLWAPI_10 - Create/Destroy the shared memory handle
187 * SHLWAPI_8/SHLWAPI_9 - Get/Release a pointer to the shared data
188 * SHLWAPI_11 - Helper function; Duplicate cross-process handles
190 HSHARED WINAPI
SHLWAPI_7 (DWORD dwProcId
, DWORD dwSize
, LPCVOID lpvData
)
194 HSHARED hRet
= (HSHARED
)NULL
;
196 TRACE("(%ld,%p,%ld)\n", dwProcId
, lpvData
, dwSize
);
198 /* Create file mapping of the correct length */
199 hMap
= CreateFileMappingA(INVALID_HANDLE_VALUE
, NULL
, FILE_MAP_READ
, 0,
200 dwSize
+ sizeof(dwSize
), NULL
);
204 /* Get a view in our process address space */
205 pMapped
= MapViewOfFile(hMap
, FILE_MAP_READ
| FILE_MAP_WRITE
, 0, 0, 0);
209 /* Write size of data, followed by the data, to the view */
210 *((DWORD
*)pMapped
) = dwSize
;
212 memcpy((char *) pMapped
+ sizeof(dwSize
), lpvData
, dwSize
);
214 /* Release view. All further views mapped will be opaque */
215 UnmapViewOfFile(pMapped
);
216 hRet
= SHLWAPI_DupSharedHandle((HSHARED
)hMap
, dwProcId
,
217 GetCurrentProcessId(), FILE_MAP_ALL_ACCESS
,
218 DUPLICATE_SAME_ACCESS
);
225 /*************************************************************************
228 * Get a pointer to a block of shared memory from a shared memory handle.
231 * hShared [I] Shared memory handle
232 * dwProcId [I] ID of process owning hShared
235 * Success: A pointer to the shared memory
241 PVOID WINAPI
SHLWAPI_8 (HSHARED hShared
, DWORD dwProcId
)
246 TRACE("(%p %ld)\n", (PVOID
)hShared
, dwProcId
);
248 /* Get handle to shared memory for current process */
249 hDup
= SHLWAPI_DupSharedHandle(hShared
, dwProcId
, GetCurrentProcessId(),
250 FILE_MAP_ALL_ACCESS
, 0);
252 pMapped
= MapViewOfFile((HANDLE
)hDup
, FILE_MAP_READ
| FILE_MAP_WRITE
, 0, 0, 0);
256 return (char *) pMapped
+ sizeof(DWORD
); /* Hide size */
260 /*************************************************************************
263 * Release a pointer to a block of shared memory.
266 * lpView [I] Shared memory pointer
275 BOOL WINAPI
SHLWAPI_9 (LPVOID lpView
)
277 TRACE("(%p)\n", lpView
);
278 return UnmapViewOfFile((char *) lpView
- sizeof(DWORD
)); /* Include size */
281 /*************************************************************************
284 * Destroy a block of sharable memory.
287 * hShared [I] Shared memory handle
288 * dwProcId [I] ID of process owning hShared
297 BOOL WINAPI
SHLWAPI_10 (HSHARED hShared
, DWORD dwProcId
)
301 TRACE("(%p %ld)\n", (PVOID
)hShared
, dwProcId
);
303 /* Get a copy of the handle for our process, closing the source handle */
304 hClose
= SHLWAPI_DupSharedHandle(hShared
, dwProcId
, GetCurrentProcessId(),
305 FILE_MAP_ALL_ACCESS
,DUPLICATE_CLOSE_SOURCE
);
306 /* Close local copy */
307 return CloseHandle((HANDLE
)hClose
);
310 /*************************************************************************
313 * Copy a sharable memory handle from one process to another.
316 * hShared [I] Shared memory handle to duplicate
317 * dwDstProcId [I] ID of the process wanting the duplicated handle
318 * dwSrcProcId [I] ID of the process owning hShared
319 * dwAccess [I] Desired DuplicateHandle access
320 * dwOptions [I] Desired DuplicateHandle options
323 * Success: A handle suitable for use by the dwDstProcId process.
324 * Failure: A NULL handle.
329 HSHARED WINAPI
SHLWAPI_11(HSHARED hShared
, DWORD dwDstProcId
, DWORD dwSrcProcId
,
330 DWORD dwAccess
, DWORD dwOptions
)
334 hRet
= SHLWAPI_DupSharedHandle(hShared
, dwDstProcId
, dwSrcProcId
,
335 dwAccess
, dwOptions
);
339 /*************************************************************************
342 * Create and register a clipboard enumerator for a web browser.
345 * lpBC [I] Binding context
346 * lpUnknown [I] An object exposing the IWebBrowserApp interface
350 * Failure: An HRESULT error code.
353 * The enumerator is stored as a property of the web browser. If it does not
354 * yet exist, it is created and set before being registered.
359 HRESULT WINAPI
SHLWAPI_13(LPBC lpBC
, IUnknown
*lpUnknown
)
361 FIXME("(%p,%p) stub\n", lpBC
, lpUnknown
);
364 /* pseudo code extracted from relay trace */
365 RegOpenKeyA(HKLM
, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Accepted Documents", &newkey
);
370 ret
= RegEnumValueA(newkey
, i
, a1
, a2
, 0, a3
, 0, 0);
374 b1
= LocalAlloc(0x40, size
);
378 ret
= RegEnumValueA(newkey
, i
, a1
, a2
, 0, a3
, a4
, a5
);
379 RegisterClipBoardFormatA(a4
);
382 hmod1
= GetModuleHandleA("URLMON.DLL");
383 proc
= GetProcAddress(hmod1
, "CreateFormatEnumerator");
384 HeapAlloc(??, 0, 0x14);
385 HeapAlloc(??, 0, 0x50);
386 LocalAlloc(0x40, 0x78);
387 /* FIXME: bad string below */
388 lstrlenW(L
"{D0FCA420-D3F5-11CF-B211-00AA004AE837}");
389 StrCpyW(a6
, L
"{D0FCA420-D3F5-11CF-B211-00AA004AE837}");
392 IsBadReadPtr(c1
= 0x403fd210,4);
393 InterlockedIncrement(c1
+4);
396 IsBadReadPtr(c1
= 0x403fd210,4);
397 InterlockedIncrement(c1
+4);
399 HeapAlloc(40350000,00000000,00000014) retval
=403fd0a8
;
400 HeapAlloc(40350000,00000000,00000050) retval
=403feb44
;
401 hmod1
= GetModuleHandleA("URLMON.DLL");
402 proc
= GetProcAddress(hmod1
, "RegisterFormatEnumerator");
403 /* 0x1a40c88c is in URLMON.DLL just before above proc
404 * content is L"_EnumFORMATETC_"
407 IsBadReadPtr(d1
= 0x1a40c88c,00000002);
410 HeapAlloc(40350000,00000000,0000001e
) retval
=403fed44
;
411 IsBadReadPtr(d2
= 0x403fd0a8,00000004);
412 InterlockedIncrement(d2
+4);
413 IsBadReadPtr(d2
= 0x403fd0a8,00000004);
414 InterlockedDecrement(d2
+4);
415 IsBadReadPtr(c1
,00000004);
416 InterlockedDecrement(c1
+4);
417 IsBadReadPtr(c1
,00000004);
418 InterlockedDecrement(c1
+4);
423 /*************************************************************************
426 * Get Explorers "AcceptLanguage" setting.
429 * langbuf [O] Destination for language string
430 * buflen [I] Length of langbuf
433 * Success: S_OK. langbuf is set to the language string found.
434 * Failure: E_FAIL, If any arguments are invalid, error occurred, or Explorer
435 * does not contain the setting.
437 HRESULT WINAPI
SHLWAPI_14 (
442 DWORD mystrlen
, mytype
;
446 mystrlen
= (*buflen
> 6) ? *buflen
: 6;
447 mystr
= (CHAR
*)HeapAlloc(GetProcessHeap(),
448 HEAP_ZERO_MEMORY
, mystrlen
);
449 RegOpenKeyA(HKEY_CURRENT_USER
,
450 "Software\\Microsoft\\Internet Explorer\\International",
452 if (RegQueryValueExA(mykey
, "AcceptLanguage",
453 0, &mytype
, mystr
, &mystrlen
)) {
454 /* Did not find value */
455 mylcid
= GetUserDefaultLCID();
456 /* somehow the mylcid translates into "en-us"
457 * this is similar to "LOCALE_SABBREVLANGNAME"
458 * which could be gotten via GetLocaleInfo.
459 * The only problem is LOCALE_SABBREVLANGUAGE" is
460 * a 3 char string (first 2 are country code and third is
461 * letter for "sublanguage", which does not come close to
464 lstrcpyA(mystr
, "en-us");
465 mystrlen
= lstrlenA(mystr
);
468 /* handle returned string */
469 FIXME("missing code\n");
471 if (mystrlen
> *buflen
)
472 lstrcpynA(langbuf
, mystr
, *buflen
);
474 lstrcpyA(langbuf
, mystr
);
475 *buflen
= lstrlenA(langbuf
);
478 HeapFree(GetProcessHeap(), 0, mystr
);
479 TRACE("language is %s\n", debugstr_a(langbuf
));
483 /*************************************************************************
486 * Unicode version of SHLWAPI_14.
488 HRESULT WINAPI
SHLWAPI_15 (
493 DWORD mystrlen
, mytype
;
497 mystrlen
= (*buflen
> 6) ? *buflen
: 6;
498 mystr
= (CHAR
*)HeapAlloc(GetProcessHeap(),
499 HEAP_ZERO_MEMORY
, mystrlen
);
500 RegOpenKeyA(HKEY_CURRENT_USER
,
501 "Software\\Microsoft\\Internet Explorer\\International",
503 if (RegQueryValueExA(mykey
, "AcceptLanguage",
504 0, &mytype
, mystr
, &mystrlen
)) {
505 /* Did not find value */
506 mylcid
= GetUserDefaultLCID();
507 /* somehow the mylcid translates into "en-us"
508 * this is similar to "LOCALE_SABBREVLANGNAME"
509 * which could be gotten via GetLocaleInfo.
510 * The only problem is LOCALE_SABBREVLANGUAGE" is
511 * a 3 char string (first 2 are country code and third is
512 * letter for "sublanguage", which does not come close to
515 lstrcpyA(mystr
, "en-us");
516 mystrlen
= lstrlenA(mystr
);
519 /* handle returned string */
520 FIXME("missing code\n");
523 *buflen
= MultiByteToWideChar(0, 0, mystr
, -1, langbuf
, (*buflen
)-1);
524 HeapFree(GetProcessHeap(), 0, mystr
);
525 TRACE("language is %s\n", debugstr_w(langbuf
));
529 /*************************************************************************
533 * converts a guid to a string
534 * returns strlen(str)
536 DWORD WINAPI
SHLWAPI_23 (
537 REFGUID guid
, /* [in] clsid */
538 LPSTR str
, /* [out] buffer */
539 INT cmax
) /* [in] size of buffer */
543 sprintf( xguid
, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
544 guid
->Data1
, guid
->Data2
, guid
->Data3
,
545 guid
->Data4
[0], guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3],
546 guid
->Data4
[4], guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7] );
547 TRACE("(%s %p 0x%08x)stub\n", xguid
, str
, cmax
);
548 if (strlen(xguid
)>=cmax
) return 0;
550 return strlen(xguid
) + 1;
553 /*************************************************************************
557 * converts a guid to a string
558 * returns strlen(str)
560 DWORD WINAPI
SHLWAPI_24 (
561 REFGUID guid
, /* [in] clsid */
562 LPWSTR str
, /* [out] buffer */
563 INT cmax
) /* [in] size of buffer */
567 sprintf( xguid
, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
568 guid
->Data1
, guid
->Data2
, guid
->Data3
,
569 guid
->Data4
[0], guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3],
570 guid
->Data4
[4], guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7] );
571 return MultiByteToWideChar( CP_ACP
, 0, xguid
, -1, str
, cmax
);
574 /*************************************************************************
577 * Seems to be iswalpha
579 BOOL WINAPI
SHLWAPI_25(WCHAR wc
)
581 return (get_char_typeW(wc
) & C1_ALPHA
) != 0;
584 /*************************************************************************
587 * Seems to be iswupper
589 BOOL WINAPI
SHLWAPI_26(WCHAR wc
)
591 return (get_char_typeW(wc
) & C1_UPPER
) != 0;
594 /*************************************************************************
597 * Seems to be iswlower
599 BOOL WINAPI
SHLWAPI_27(WCHAR wc
)
601 return (get_char_typeW(wc
) & C1_LOWER
) != 0;
604 /*************************************************************************
607 * Seems to be iswalnum
609 BOOL WINAPI
SHLWAPI_28(WCHAR wc
)
611 return (get_char_typeW(wc
) & (C1_ALPHA
|C1_DIGIT
)) != 0;
614 /*************************************************************************
617 * Seems to be iswspace
619 BOOL WINAPI
SHLWAPI_29(WCHAR wc
)
621 return (get_char_typeW(wc
) & C1_SPACE
) != 0;
624 /*************************************************************************
627 * Seems to be iswblank
629 BOOL WINAPI
SHLWAPI_30(WCHAR wc
)
631 return (get_char_typeW(wc
) & C1_BLANK
) != 0;
634 /*************************************************************************
637 * Seems to be iswpunct
639 BOOL WINAPI
SHLWAPI_31(WCHAR wc
)
641 return (get_char_typeW(wc
) & C1_PUNCT
) != 0;
644 /*************************************************************************
647 * Seems to be iswcntrl
649 BOOL WINAPI
SHLWAPI_32(WCHAR wc
)
651 return (get_char_typeW(wc
) & C1_CNTRL
) != 0;
654 /*************************************************************************
657 * Seems to be iswdigit
659 BOOL WINAPI
SHLWAPI_33(WCHAR wc
)
661 return (get_char_typeW(wc
) & C1_DIGIT
) != 0;
664 /*************************************************************************
667 * Seems to be iswxdigit
669 BOOL WINAPI
SHLWAPI_34(WCHAR wc
)
671 return (get_char_typeW(wc
) & C1_XDIGIT
) != 0;
674 /*************************************************************************
678 BOOL WINAPI
SHLWAPI_35(LPVOID p1
, DWORD dw2
, LPVOID p3
)
680 FIXME("(%p, 0x%08lx, %p): stub\n", p1
, dw2
, p3
);
684 /*************************************************************************
687 * Insert a bitmap menu item at the bottom of a menu.
690 * hMenu [I] Menu to insert into
691 * flags [I] Flags for insertion
692 * id [I] Menu ID of the item
693 * str [I] Menu text for the item
696 * Success: TRUE, the item is inserted into the menu
697 * Failure: FALSE, if any parameter is invalid
699 BOOL WINAPI
SHLWAPI_36(HMENU hMenu
, UINT flags
, UINT id
, LPCWSTR str
)
701 TRACE("(%p,0x%08x,0x%08x,%s)\n",hMenu
, flags
, id
, debugstr_w(str
));
702 return InsertMenuW(hMenu
, -1, flags
| MF_BITMAP
, id
, str
);
705 /*************************************************************************
708 * Get the text from a given dialog item.
711 * hWnd [I] Handle of dialog
712 * nItem [I] Index of item
713 * lpsDest [O] Buffer for receiving window text
714 * nDestLen [I] Length of buffer.
717 * Success: The length of the returned text.
720 INT WINAPI
SHLWAPI_74(HWND hWnd
, INT nItem
, LPWSTR lpsDest
,INT nDestLen
)
722 HWND hItem
= GetDlgItem(hWnd
, nItem
);
725 return GetWindowTextW(hItem
, lpsDest
, nDestLen
);
727 *lpsDest
= (WCHAR
)'\0';
731 /*************************************************************************
734 * Set the text of a given dialog item.
737 * hWnd [I] Handle of dialog
738 * iItem [I] Index of item
739 * lpszText [O] Text to set
742 * Success: TRUE. The text of the dialog is set to lpszText.
743 * Failure: FALSE, Otherwise.
745 BOOL WINAPI
SHLWAPI_138(HWND hWnd
, INT iItem
, LPCWSTR lpszText
)
747 HWND hWndItem
= GetDlgItem(hWnd
, iItem
);
749 return SetWindowTextW(hWndItem
, lpszText
);
753 /*************************************************************************
755 * Function: Compare two ASCII strings for "len" bytes.
756 * Returns: *str1-*str2 (case sensitive)
758 DWORD WINAPI
SHLWAPI_151(LPCSTR str1
, LPCSTR str2
, INT len
)
760 return strncmp( str1
, str2
, len
);
763 /*************************************************************************
766 * Function: Compare two WIDE strings for "len" bytes.
767 * Returns: *str1-*str2 (case sensitive)
769 DWORD WINAPI
SHLWAPI_152(LPCWSTR str1
, LPCWSTR str2
, INT len
)
771 return strncmpW( str1
, str2
, len
);
774 /*************************************************************************
776 * Function: Compare two ASCII strings for "len" bytes via caseless compare.
777 * Returns: *str1-*str2 (case insensitive)
779 DWORD WINAPI
SHLWAPI_153(LPCSTR str1
, LPCSTR str2
, DWORD len
)
781 return strncasecmp( str1
, str2
, len
);
784 /*************************************************************************
787 * Function: Compare two WIDE strings for "len" bytes via caseless compare.
788 * Returns: *str1-*str2 (case insensitive)
790 DWORD WINAPI
SHLWAPI_154(LPCWSTR str1
, LPCWSTR str2
, DWORD len
)
792 return strncmpiW( str1
, str2
, len
);
795 /*************************************************************************
798 * Case sensitive string compare (ASCII). Does not SetLastError().
800 DWORD WINAPI
SHLWAPI_155(LPCSTR str1
, LPCSTR str2
)
802 return strcmp(str1
, str2
);
805 /*************************************************************************
808 * Case sensitive string compare. Does not SetLastError().
810 DWORD WINAPI
SHLWAPI_156(LPCWSTR str1
, LPCWSTR str2
)
812 return strcmpW( str1
, str2
);
815 /*************************************************************************
818 * Case insensitive string compare (ASCII). Does not SetLastError().
820 DWORD WINAPI
SHLWAPI_157(LPCSTR str1
, LPCSTR str2
)
822 return strcasecmp(str1
, str2
);
824 /*************************************************************************
827 * Case insensitive string compare. Does not SetLastError(). ??
829 DWORD WINAPI
SHLWAPI_158 (LPCWSTR str1
, LPCWSTR str2
)
831 return strcmpiW( str1
, str2
);
834 /*************************************************************************
837 * Remove a hanging lead byte from the end of a string, if present.
840 * lpStr [I] String to check for a hanging lead byte
841 * size [I] Length of lpszStr
844 * Success: The new size of the string. Any hanging lead bytes are removed.
845 * Failure: 0, if any parameters are invalid.
847 DWORD WINAPI
SHLWAPI_162(LPSTR lpStr
, DWORD size
)
851 LPSTR lastByte
= lpStr
+ size
- 1;
853 while(lpStr
< lastByte
)
854 lpStr
+= IsDBCSLeadByte(*lpStr
) ? 2 : 1;
856 if(lpStr
== lastByte
&& IsDBCSLeadByte(*lpStr
))
866 /*************************************************************************
869 * Call IOleCommandTarget::QueryStatus() on an object.
872 * lpUnknown [I] Object supporting the IOleCommandTarget interface
873 * pguidCmdGroup [I] GUID for the command group
875 * prgCmds [O] Commands
876 * pCmdText [O] Command text
880 * Failure: E_FAIL, if lpUnknown is NULL.
881 * E_NOINTERFACE, if lpUnknown does not support IOleCommandTarget.
882 * Otherwise, an error code from IOleCommandTarget::QueryStatus().
884 HRESULT WINAPI
SHLWAPI_163(IUnknown
* lpUnknown
, REFGUID pguidCmdGroup
,
885 ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
* pCmdText
)
887 HRESULT hRet
= E_FAIL
;
889 TRACE("(%p,%p,%ld,%p,%p)\n",lpUnknown
, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
893 IOleCommandTarget
* lpOle
;
895 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IOleCommandTarget
,
898 if (SUCCEEDED(hRet
) && lpOle
)
900 hRet
= IOleCommandTarget_QueryStatus(lpOle
, pguidCmdGroup
, cCmds
,
902 IOleCommandTarget_Release(lpOle
);
908 /*************************************************************************
911 * Call IOleCommandTarget::Exec() on an object.
914 * lpUnknown [I] Object supporting the IOleCommandTarget interface
915 * pguidCmdGroup [I] GUID for the command group
919 * Failure: E_FAIL, if lpUnknown is NULL.
920 * E_NOINTERFACE, if lpUnknown does not support IOleCommandTarget.
921 * Otherwise, an error code from IOleCommandTarget::Exec().
923 HRESULT WINAPI
SHLWAPI_164(IUnknown
* lpUnknown
, REFGUID pguidCmdGroup
,
924 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
* pvaIn
,
927 HRESULT hRet
= E_FAIL
;
929 TRACE("(%p,%p,%ld,%ld,%p,%p)\n",lpUnknown
, pguidCmdGroup
, nCmdID
,
930 nCmdexecopt
, pvaIn
, pvaOut
);
934 IOleCommandTarget
* lpOle
;
936 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IOleCommandTarget
,
938 if (SUCCEEDED(hRet
) && lpOle
)
940 hRet
= IOleCommandTarget_Exec(lpOle
, pguidCmdGroup
, nCmdID
,
941 nCmdexecopt
, pvaIn
, pvaOut
);
942 IOleCommandTarget_Release(lpOle
);
948 /*************************************************************************
951 * Retrieve, modify, and re-set a value from a window.
954 * hWnd [I] Windows to get value from
955 * offset [I] Offset of value
956 * wMask [I] Mask for uiFlags
957 * wFlags [I] Bits to set in window value
960 * The new value as it was set, or 0 if any parameter is invalid.
963 * Any bits set in uiMask are cleared from the value, then any bits set in
964 * uiFlags are set in the value.
966 LONG WINAPI
SHLWAPI_165(HWND hwnd
, INT offset
, UINT wMask
, UINT wFlags
)
968 LONG ret
= GetWindowLongA(hwnd
, offset
);
969 UINT newFlags
= (wFlags
& wMask
) | (ret
& ~wFlags
);
972 ret
= SetWindowLongA(hwnd
, offset
, newFlags
);
976 /*************************************************************************
979 * Change a window's parent.
982 * hWnd [I] Window to change parent of
983 * hWndParent [I] New parent window
986 * The old parent of hWnd.
989 * If hWndParent is NULL (desktop), the window style is changed to WS_POPUP.
990 * If hWndParent is NOT NULL then we set the WS_CHILD style.
992 HWND WINAPI
SHLWAPI_167(HWND hWnd
, HWND hWndParent
)
994 TRACE("%p, %p\n", hWnd
, hWndParent
);
996 if(GetParent(hWnd
) == hWndParent
)
1000 SHLWAPI_165(hWnd
, GWL_STYLE
, WS_CHILD
, WS_CHILD
);
1002 SHLWAPI_165(hWnd
, GWL_STYLE
, WS_POPUP
, WS_POPUP
);
1004 return SetParent(hWnd
, hWndParent
);
1007 /*************************************************************************
1010 * Locate and advise a connection point in an IConnectionPointContainer.
1013 * lpUnkSink [I] Sink for the connection point advise call
1014 * riid [I] REFIID of connection point to advise
1015 * bAdviseOnly [I] TRUE = Advise only, FALSE = Unadvise first
1016 * lpUnknown [I] Object supporting the IConnectionPointContainer interface
1017 * lpCookie [O] Pointer to connection point cookie
1018 * lppCP [O] Destination for the IConnectionPoint found
1021 * Success: S_OK. If lppCP is non-NULL, it is filled with the IConnectionPoint
1022 * that was advised. The caller is responsable for releasing it.
1023 * Failure: E_FAIL, if any arguments are invalid.
1024 * E_NOINTERFACE, if lpUnknown isn't an IConnectionPointContainer,
1025 * Or an HRESULT error code if any call fails.
1027 HRESULT WINAPI
SHLWAPI_168(IUnknown
* lpUnkSink
, REFIID riid
, BOOL bAdviseOnly
,
1028 IUnknown
* lpUnknown
, LPDWORD lpCookie
,
1029 IConnectionPoint
**lppCP
)
1032 IConnectionPointContainer
* lpContainer
;
1033 IConnectionPoint
*lpCP
;
1035 if(!lpUnknown
|| (bAdviseOnly
&& !lpUnkSink
))
1041 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IConnectionPointContainer
,
1042 (void**)&lpContainer
);
1043 if (SUCCEEDED(hRet
))
1045 hRet
= IConnectionPointContainer_FindConnectionPoint(lpContainer
, riid
, &lpCP
);
1047 if (SUCCEEDED(hRet
))
1050 hRet
= IConnectionPoint_Unadvise(lpCP
, *lpCookie
);
1051 hRet
= IConnectionPoint_Advise(lpCP
, lpUnkSink
, lpCookie
);
1056 if (lppCP
&& SUCCEEDED(hRet
))
1057 *lppCP
= lpCP
; /* Caller keeps the interface */
1059 IConnectionPoint_Release(lpCP
); /* Release it */
1062 IUnknown_Release(lpContainer
);
1067 /*************************************************************************
1071 * Release an interface.
1074 * lpUnknown [I] Object to release
1079 DWORD WINAPI
SHLWAPI_169 (IUnknown
** lpUnknown
)
1083 TRACE("(%p)\n",lpUnknown
);
1084 if(!lpUnknown
|| !*((LPDWORD
)lpUnknown
)) return 0;
1087 TRACE("doing Release\n");
1088 return IUnknown_Release(temp
);
1091 /*************************************************************************
1094 * Skip '//' if present in a string.
1097 * lpszSrc [I] String to check for '//'
1100 * Success: The next character after the '//' or the string if not present
1101 * Failure: NULL, if lpszStr is NULL.
1103 LPCSTR WINAPI
SHLWAPI_170(LPCSTR lpszSrc
)
1105 if (lpszSrc
&& lpszSrc
[0] == '/' && lpszSrc
[1] == '/')
1110 /*************************************************************************
1113 * Check the two interfaces if they come from the same object.
1116 * lpInt1 [I]: Interface to check against lpInt2.
1117 * lpInt2 [I]: Interface to check against lpInt1.
1120 * TRUE: Interfaces come from the same object.
1121 * FALSE: Interfaces come from different objects.
1123 BOOL WINAPI
SHLWAPI_171(IUnknown
* lpInt1
, IUnknown
* lpInt2
)
1125 LPVOID lpUnknown1
, lpUnknown2
;
1127 TRACE("%p %p\n", lpInt1
, lpInt2
);
1129 if (!lpInt1
|| !lpInt2
)
1132 if (lpInt1
== lpInt2
)
1135 if (!SUCCEEDED(IUnknown_QueryInterface(lpInt1
, &IID_IUnknown
,
1136 (LPVOID
*)&lpUnknown1
)))
1139 if (!SUCCEEDED(IUnknown_QueryInterface(lpInt2
, &IID_IUnknown
,
1140 (LPVOID
*)&lpUnknown2
)))
1143 if (lpUnknown1
== lpUnknown2
)
1149 /*************************************************************************
1152 * Get the window handle of an object.
1155 * lpUnknown [I] Object to get the window handle of
1156 * lphWnd [O] Destination for window handle
1159 * Success: S_OK. lphWnd contains the objects window handle.
1160 * Failure: An HRESULT error code.
1163 * lpUnknown is expected to support one of the following interfaces:
1165 * IInternetSecurityMgrSite
1168 HRESULT WINAPI
SHLWAPI_172(IUnknown
*lpUnknown
, HWND
*lphWnd
)
1170 /* FIXME: Wine has no header for this object */
1171 static const GUID IID_IInternetSecurityMgrSite
= { 0x79eac9ed,
1172 0xbaf9, 0x11ce, { 0x8c, 0x82, 0x00, 0xaa, 0x00, 0x4b, 0xa9, 0x0b }};
1174 HRESULT hRet
= E_FAIL
;
1176 TRACE("(%p,%p)\n", lpUnknown
, lphWnd
);
1181 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IOleWindow
, (void**)&lpOle
);
1185 hRet
= IUnknown_QueryInterface(lpUnknown
,&IID_IShellView
, (void**)&lpOle
);
1189 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IInternetSecurityMgrSite
,
1194 if (SUCCEEDED(hRet
))
1196 /* Lazyness here - Since GetWindow() is the first method for the above 3
1197 * interfaces, we use the same call for them all.
1199 hRet
= IOleWindow_GetWindow((IOleWindow
*)lpOle
, lphWnd
);
1200 IUnknown_Release(lpOle
);
1202 TRACE("Returning HWND=%p\n", *lphWnd
);
1208 /*************************************************************************
1211 * Seems to do call either IObjectWithSite::SetSite or
1212 * IPersistMoniker::GetClassID. But since we do not implement either
1213 * of those classes in our headers, we will fake it out.
1215 DWORD WINAPI
SHLWAPI_174(
1216 IUnknown
*p1
, /* [in] OLE object */
1217 LPVOID
*p2
) /* [out] ptr to result of either GetClassID
1222 if (!p1
) return E_FAIL
;
1224 /* see if SetSite interface exists for IObjectWithSite object */
1225 ret
= IUnknown_QueryInterface((IUnknown
*)p1
, (REFIID
)id1
, (LPVOID
*)&p1
);
1226 TRACE("first IU_QI ret=%08lx, p1=%p\n", ret
, p1
);
1229 /* see if GetClassId interface exists for IPersistMoniker object */
1230 ret
= IUnknown_QueryInterface((IUnknown
*)p1
, (REFIID
)id2
, (LPVOID
*)&aa
);
1231 TRACE("second IU_QI ret=%08lx, aa=%08lx\n", ret
, aa
);
1232 if (ret
) return ret
;
1234 /* fake a GetClassId call */
1235 ret
= IOleWindow_GetWindow((IOleWindow
*)aa
, (HWND
*)p2
);
1236 TRACE("second IU_QI doing 0x0c ret=%08lx, *p2=%08lx\n", ret
,
1238 IUnknown_Release((IUnknown
*)aa
);
1241 /* fake a SetSite call */
1242 ret
= IOleWindow_GetWindow((IOleWindow
*)p1
, (HWND
*)p2
);
1243 TRACE("first IU_QI doing 0x0c ret=%08lx, *p2=%08lx\n", ret
,
1245 IUnknown_Release((IUnknown
*)p1
);
1250 /*************************************************************************
1253 * Call IPersist::GetClassID on an object.
1256 * lpUnknown [I] Object supporting the IPersist interface
1257 * lpClassId [O] Destination for Class Id
1260 * Success: S_OK. lpClassId contains the Class Id requested.
1261 * Failure: E_FAIL, If lpUnknown is NULL,
1262 * E_NOINTERFACE If lpUnknown does not support IPersist,
1263 * Or an HRESULT error code.
1265 HRESULT WINAPI
SHLWAPI_175 (IUnknown
*lpUnknown
, CLSID
* lpClassId
)
1267 IPersist
* lpPersist
;
1268 HRESULT hRet
= E_FAIL
;
1270 TRACE("(%p,%p)\n", lpUnknown
, debugstr_guid(lpClassId
));
1274 hRet
= IUnknown_QueryInterface(lpUnknown
,&IID_IPersist
,(void**)&lpPersist
);
1275 if (SUCCEEDED(hRet
))
1277 IPersist_GetClassID(lpPersist
, lpClassId
);
1278 IPersist_Release(lpPersist
);
1284 /*************************************************************************
1287 * Retrieve a Service Interface from an object.
1290 * lpUnknown [I] Object to get an IServiceProvider interface from
1291 * sid [I] Service ID for QueryService call
1292 * riid [I] Function requested for QueryService call
1293 * lppOut [O] Destination for the service interface pointer
1295 * Function appears to be interface to IServiceProvider::QueryService
1298 * Success: S_OK. lppOut contains an object providing the requested service
1299 * Failure: An HRESULT error code
1302 * lpUnknown is expected to support the IServiceProvider interface.
1304 HRESULT WINAPI
SHLWAPI_176(IUnknown
* lpUnknown
, REFGUID sid
, REFIID riid
,
1307 IServiceProvider
* pService
= NULL
;
1318 /* Get an IServiceProvider interface from the object */
1319 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IServiceProvider
,
1320 (LPVOID
*)&pService
);
1322 if (!hRet
&& pService
)
1324 TRACE("QueryInterface returned (IServiceProvider*)%p\n", pService
);
1326 /* Get a Service interface from the object */
1327 hRet
= IServiceProvider_QueryService(pService
, sid
, riid
, lppOut
);
1329 TRACE("(IServiceProvider*)%p returned (IUnknown*)%p\n", pService
, *lppOut
);
1331 /* Release the IServiceProvider interface */
1332 IUnknown_Release(pService
);
1337 /*************************************************************************
1340 * Remove all sub-menus from a menu.
1343 * hMenu [I] Menu to remove sub-menus from
1346 * Success: 0. All sub-menus under hMenu are removed
1347 * Failure: -1, if any parameter is invalid
1349 DWORD WINAPI
SHLWAPI_180(HMENU hMenu
)
1351 int iItemCount
= GetMenuItemCount(hMenu
) - 1;
1352 while (iItemCount
>= 0)
1354 HMENU hSubMenu
= GetSubMenu(hMenu
, iItemCount
);
1356 RemoveMenu(hMenu
, iItemCount
, 0x400);
1362 /*************************************************************************
1365 * Enable or disable a menu item.
1368 * hMenu [I] Menu holding menu item
1369 * uID [I] ID of menu item to enable/disable
1370 * bEnable [I] Whether to enable (TRUE) or disable (FALSE) the item.
1373 * The return code from CheckMenuItem.
1375 UINT WINAPI
SHLWAPI_181(HMENU hMenu
, UINT wItemID
, BOOL bEnable
)
1377 return EnableMenuItem(hMenu
, wItemID
, bEnable
? MF_ENABLED
: MF_GRAYED
);
1380 /*************************************************************************
1383 * Check or uncheck a menu item.
1386 * hMenu [I] Menu holding menu item
1387 * uID [I] ID of menu item to check/uncheck
1388 * bCheck [I] Whether to check (TRUE) or uncheck (FALSE) the item.
1391 * The return code from CheckMenuItem.
1393 DWORD WINAPI
SHLWAPI_182(HMENU hMenu
, UINT uID
, BOOL bCheck
)
1395 return CheckMenuItem(hMenu
, uID
, bCheck
? MF_CHECKED
: 0);
1398 /*************************************************************************
1401 * Register a window class if it isn't already.
1404 * lpWndClass [I] Window class to register
1407 * The result of the RegisterClassA call.
1409 DWORD WINAPI
SHLWAPI_183(WNDCLASSA
*wndclass
)
1412 if (GetClassInfoA(wndclass
->hInstance
, wndclass
->lpszClassName
, &wca
))
1414 return (DWORD
)RegisterClassA(wndclass
);
1417 /*************************************************************************
1420 * Call IPersistPropertyBag::Load on an object.
1423 * lpUnknown [I] Object supporting the IPersistPropertyBag interface
1424 * lpPropBag [O] Destination for loaded IPropertyBag
1428 * Failure: An HRESULT error code, or E_FAIL if lpUnknown is NULL.
1430 DWORD WINAPI
SHLWAPI_187(IUnknown
*lpUnknown
, IPropertyBag
* lpPropBag
)
1432 IPersistPropertyBag
* lpPPBag
;
1433 HRESULT hRet
= E_FAIL
;
1435 TRACE("(%p,%p)\n", lpUnknown
, lpPropBag
);
1439 hRet
= IUnknown_QueryInterface(lpUnknown
, &IID_IPersistPropertyBag
,
1441 if (SUCCEEDED(hRet
) && lpPPBag
)
1443 hRet
= IPersistPropertyBag_Load(lpPPBag
, lpPropBag
, NULL
);
1444 IPersistPropertyBag_Release(lpPPBag
);
1450 /*************************************************************************
1453 * _IUnknown_OnFocusOCS
1455 DWORD WINAPI
SHLWAPI_189(LPVOID x
, LPVOID y
)
1457 FIXME("%p %p\n", x
, y
);
1461 /*************************************************************************
1464 * Get the color depth of the primary display.
1470 * The color depth of the primary display.
1472 DWORD WINAPI
SHLWAPI_193 ()
1480 ret
= GetDeviceCaps(hdc
, BITSPIXEL
) * GetDeviceCaps(hdc
, PLANES
);
1485 /*************************************************************************
1488 * Blank out a region of text by drawing the background only.
1491 * hDC [I] Device context to draw in
1492 * pRect [I] Area to draw in
1493 * cRef [I] Color to draw in
1498 DWORD WINAPI
SHLWAPI_197(HDC hDC
, LPCRECT pRect
, COLORREF cRef
)
1500 COLORREF cOldColor
= SetBkColor(hDC
, cRef
);
1501 ExtTextOutA(hDC
, 0, 0, ETO_OPAQUE
, pRect
, 0, 0, 0);
1502 SetBkColor(hDC
, cOldColor
);
1506 /*************************************************************************
1509 * Copy interface pointer
1512 * lppDest [O] Destination for copy
1513 * lpUnknown [I] Source for copy
1518 VOID WINAPI
SHLWAPI_199(IUnknown
**lppDest
, IUnknown
*lpUnknown
)
1520 TRACE("(%p,%p)\n", lppDest
, lpUnknown
);
1523 SHLWAPI_169(lppDest
); /* Release existing interface */
1528 IUnknown_AddRef(lpUnknown
);
1529 *lppDest
= lpUnknown
;
1533 /*************************************************************************
1537 HRESULT WINAPI
SHLWAPI_201(IUnknown
* lpUnknown
, INT iUnk
, REFGUID pguidCmdGroup
,
1538 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
* pvaIn
,
1541 FIXME("(%p,%d,%p,%ld,%ld,%p,%p) - stub!\n", lpUnknown
, iUnk
, pguidCmdGroup
,
1542 nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1543 return DRAGDROP_E_NOTREGISTERED
;
1546 /*************************************************************************
1550 HRESULT WINAPI
SHLWAPI_202(REFGUID pguidCmdGroup
,ULONG cCmds
, OLECMD
*prgCmds
)
1552 FIXME("(%p,%ld,%p) - stub!\n", pguidCmdGroup
, cCmds
, prgCmds
);
1553 return DRAGDROP_E_NOTREGISTERED
;
1556 /*************************************************************************
1560 VOID WINAPI
SHLWAPI_203(LPCSTR lpszStr
)
1562 FIXME("(%s) - stub!\n", debugstr_a(lpszStr
));
1565 /*************************************************************************
1568 * Determine if a window is not a child of another window.
1571 * hParent [I] Suspected parent window
1572 * hChild [I] Suspected child window
1575 * TRUE: If hChild is a child window of hParent
1576 * FALSE: If hChild is not a child window of hParent, or they are equal
1578 BOOL WINAPI
SHLWAPI_204(HWND hParent
, HWND hChild
)
1580 TRACE("(%p,%p)\n", hParent
, hChild
);
1582 if (!hParent
|| !hChild
)
1584 else if(hParent
== hChild
)
1586 return !IsChild(hParent
, hChild
);
1589 /*************************************************************************
1592 * Some sort of memory management process - associated with _210
1594 DWORD WINAPI
SHLWAPI_208 (
1601 FIXME("(0x%08lx 0x%08lx %p %p 0x%08lx) stub\n",
1606 /*************************************************************************
1609 * Some sort of memory management process - associated with _208
1611 DWORD WINAPI
SHLWAPI_209 (
1614 FIXME("(%p) stub\n",
1619 /*************************************************************************
1622 * Some sort of memory management process - associated with _208
1624 DWORD WINAPI
SHLWAPI_210 (
1629 FIXME("(%p 0x%08lx %p) stub\n",
1634 /*************************************************************************
1637 DWORD WINAPI
SHLWAPI_211 (
1641 FIXME("(%p 0x%08lx) stub\n",
1646 /*************************************************************************
1652 DWORD WINAPI
SHLWAPI_215 (
1659 len_a
= lstrlenA(lpStrSrc
);
1660 ret
= MultiByteToWideChar(0, 0, lpStrSrc
, len_a
, lpwStrDest
, len
);
1661 TRACE("%s %s %d, ret=%d\n",
1662 debugstr_a(lpStrSrc
), debugstr_w(lpwStrDest
), len
, ret
);
1666 /*************************************************************************
1669 * WideCharToMultiByte with multi language support.
1671 INT WINAPI
SHLWAPI_218(UINT CodePage
, LPCWSTR lpSrcStr
, LPSTR lpDstStr
,
1672 LPINT lpnMultiCharCount
)
1674 WCHAR emptyW
[] = { '\0' };
1678 if (!lpDstStr
|| !lpnMultiCharCount
)
1686 len
= strlenW(lpSrcStr
) + 1;
1691 CodePage
= CP_UTF8
; /* Fall through... */
1692 case 0x0000C350: /* FIXME: CP_ #define */
1697 INT nWideCharCount
= len
- 1;
1699 GET_FUNC(pConvertINetUnicodeToMultiByte
, mlang
, "ConvertINetUnicodeToMultiByte", 0);
1700 if (!pConvertINetUnicodeToMultiByte(&dwMode
, CodePage
, lpSrcStr
, &nWideCharCount
, lpDstStr
,
1704 if (nWideCharCount
< len
- 1)
1706 mem
= (LPSTR
)HeapAlloc(GetProcessHeap(), 0, *lpnMultiCharCount
);
1710 *lpnMultiCharCount
= 0;
1712 if (pConvertINetUnicodeToMultiByte(&dwMode
, CodePage
, lpSrcStr
, &len
, mem
, lpnMultiCharCount
))
1714 SHLWAPI_162 (mem
, *lpnMultiCharCount
);
1715 lstrcpynA(lpDstStr
, mem
, *lpnMultiCharCount
+ 1);
1716 return *lpnMultiCharCount
+ 1;
1718 HeapFree(GetProcessHeap(), 0, mem
);
1719 return *lpnMultiCharCount
;
1721 lpDstStr
[*lpnMultiCharCount
] = '\0';
1722 return *lpnMultiCharCount
;
1729 reqLen
= WideCharToMultiByte(CodePage
, 0, lpSrcStr
, len
, lpDstStr
,
1730 *lpnMultiCharCount
, NULL
, NULL
);
1732 if (!reqLen
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
)
1734 reqLen
= WideCharToMultiByte(CodePage
, 0, lpSrcStr
, len
, NULL
, 0, NULL
, NULL
);
1737 mem
= (LPSTR
)HeapAlloc(GetProcessHeap(), 0, reqLen
);
1740 reqLen
= WideCharToMultiByte(CodePage
, 0, lpSrcStr
, len
, mem
,
1741 reqLen
, NULL
, NULL
);
1743 reqLen
= SHLWAPI_162(mem
, *lpnMultiCharCount
);
1746 lstrcpynA(lpDstStr
, mem
, *lpnMultiCharCount
);
1748 HeapFree(GetProcessHeap(), 0, mem
);
1755 /*************************************************************************
1758 * Hmm, some program used lpnMultiCharCount == 0x3 (and lpSrcStr was "C")
1759 * --> Crash. Something wrong here.
1761 * It seems from OE v5 that the third param is the count. (GA 11/2001)
1763 INT WINAPI
SHLWAPI_217(LPCWSTR lpSrcStr
, LPSTR lpDstStr
, INT MultiCharCount
)
1765 INT myint
= MultiCharCount
;
1767 return SHLWAPI_218(CP_ACP
, lpSrcStr
, lpDstStr
, &myint
);
1770 /*************************************************************************
1773 * Seems to be "super" QueryInterface. Supplied with a table of interfaces
1774 * and an array of IIDs and offsets into the table.
1777 * error codes: E_POINTER, E_NOINTERFACE
1784 HRESULT WINAPI
SHLWAPI_219 (
1785 LPVOID w
, /* [in] table of interfaces */
1786 IFACE_INDEX_TBL
*x
, /* [in] array of REFIIDs and indexes to above */
1787 REFIID riid
, /* [in] REFIID to get interface for */
1788 LPVOID
*ppv
) /* [out] location to get interface pointer */
1792 IFACE_INDEX_TBL
*xmove
;
1794 TRACE("(%p %p %s %p)\n", w
,x
,debugstr_guid(riid
),ppv
);
1797 while (xmove
->refid
) {
1798 TRACE("trying (indx %ld) %s\n", xmove
->indx
, debugstr_guid(xmove
->refid
));
1799 if (IsEqualIID(riid
, xmove
->refid
)) {
1800 a_vtbl
= (IUnknown
*)(xmove
->indx
+ (LPBYTE
)w
);
1801 TRACE("matched, returning (%p)\n", a_vtbl
);
1802 *ppv
= (LPVOID
)a_vtbl
;
1803 IUnknown_AddRef(a_vtbl
);
1809 if (IsEqualIID(riid
, &IID_IUnknown
)) {
1810 a_vtbl
= (IUnknown
*)(x
->indx
+ (LPBYTE
)w
);
1811 TRACE("returning first for IUnknown (%p)\n", a_vtbl
);
1812 *ppv
= (LPVOID
)a_vtbl
;
1813 IUnknown_AddRef(a_vtbl
);
1817 ret
= E_NOINTERFACE
;
1821 TRACE("-- 0x%08lx\n", ret
);
1825 /*************************************************************************
1828 HMODULE WINAPI
SHLWAPI_236 (REFIID lpUnknown
)
1832 CHAR value
[MAX_PATH
], string
[MAX_PATH
];
1834 strcpy(string
, "CLSID\\");
1835 strcat(string
, debugstr_guid(lpUnknown
));
1836 strcat(string
, "\\InProcServer32");
1839 RegOpenKeyExA(HKEY_CLASSES_ROOT
, string
, 0, 1, &newkey
);
1840 RegQueryValueExA(newkey
, 0, 0, &type
, value
, &count
);
1841 RegCloseKey(newkey
);
1842 return LoadLibraryExA(value
, 0, 0);
1845 /*************************************************************************
1848 * Unicode version of SHLWAPI_183.
1850 DWORD WINAPI
SHLWAPI_237 (WNDCLASSW
* lpWndClass
)
1854 TRACE("(%p %s)\n",lpWndClass
->hInstance
, debugstr_w(lpWndClass
->lpszClassName
));
1856 if (GetClassInfoW(lpWndClass
->hInstance
, lpWndClass
->lpszClassName
, &WndClass
))
1858 return RegisterClassW(lpWndClass
);
1861 /*************************************************************************
1864 DWORD WINAPI
SHLWAPI_239(HINSTANCE hInstance
, LPVOID p2
, DWORD dw3
)
1866 FIXME("(%p %p 0x%08lx) stub\n",
1867 hInstance
, p2
, dw3
);
1870 /* pseudo code from relay trace */
1871 WideCharToMultiByte(0, 0, L
"Shell DocObject View", -1, &aa
, 0x0207, 0, 0);
1872 GetClassInfoA(70fe0000
,405868ec
"Shell DocObject View",40586b14
);
1873 /* above pair repeated for:
1874 TridentThicketUrlDlClass
1883 /*************************************************************************
1886 * Call The correct (ASCII/Unicode) default window procedure for a window.
1889 * hWnd [I] Window to call the default proceedure for
1890 * uMessage [I] Message ID
1891 * wParam [I] WPARAM of message
1892 * lParam [I] LPARAM of message
1895 * The result of calling the window proceedure.
1897 LRESULT CALLBACK
SHLWAPI_240(HWND hWnd
, UINT uMessage
, WPARAM wParam
, LPARAM lParam
)
1899 if (IsWindowUnicode(hWnd
))
1900 return DefWindowProcW(hWnd
, uMessage
, wParam
, lParam
);
1901 return DefWindowProcA(hWnd
, uMessage
, wParam
, lParam
);
1904 /*************************************************************************
1908 DWORD WINAPI
SHLWAPI_241 ()
1911 return /* 0xabba1243 */ 0;
1914 /*************************************************************************
1917 * native does at least approximately:
1918 * strcpyW(newstr, x);
1919 * strcatW(newstr, "\\Restrictions");
1920 * if (RegOpenKeyExA(80000001, newstr, 00000000,00000001,40520b78))
1924 DWORD WINAPI
SHLWAPI_266 (
1926 LPVOID x
, /* [in] partial registry key */
1930 FIXME("(%p %p %p %p)stub\n",w
,x
,y
,z
);
1931 return /* 0xabba1248 */ 0;
1934 /*************************************************************************
1938 * This QueryInterface asks the inner object for a interface. In case
1939 * of aggregation this request would be forwarded by the inner to the
1940 * outer object. This function asks the inner object directly for the
1941 * interface circumventing the forwarding to the outer object.
1943 HRESULT WINAPI
SHLWAPI_267 (
1944 IUnknown
* pUnk
, /* [in] outer object */
1945 IUnknown
* pInner
, /* [in] inner object */
1949 HRESULT hret
= E_NOINTERFACE
;
1950 TRACE("(pUnk=%p pInner=%p\n\tIID: %s %p)\n",pUnk
,pInner
,debugstr_guid(riid
), ppv
);
1953 if(pUnk
&& pInner
) {
1954 hret
= IUnknown_QueryInterface(pInner
, riid
, (LPVOID
*)ppv
);
1955 if (SUCCEEDED(hret
)) IUnknown_Release(pUnk
);
1957 TRACE("-- 0x%08lx\n", hret
);
1961 /*************************************************************************
1964 * Move a reference from one interface to another.
1967 * lpDest [O] Destination to receive the reference
1968 * lppUnknown [O] Source to give up the reference to lpDest
1973 VOID WINAPI
SHLWAPI_268(IUnknown
*lpDest
, IUnknown
**lppUnknown
)
1975 TRACE("(%p,%p)\n", lpDest
, lppUnknown
);
1980 IUnknown_AddRef(lpDest
);
1981 SHLWAPI_169(lppUnknown
); /* Release existing interface */
1985 /*************************************************************************
1988 * Determine if the browser is integrated into the shell, and set a registry
1995 * 1, If the browser is not integrated.
1996 * 2, If the browser is integrated.
1999 * The key HKLM\Software\Microsoft\Internet Explorer\IntegratedBrowser is
2000 * either set to TRUE, or removed depending on whether the browser is deemed
2003 DWORD WINAPI
SHLWAPI_276()
2005 static LPCSTR szIntegratedBrowser
= "IntegratedBrowser";
2006 static DWORD dwState
= 0;
2008 DWORD dwRet
, dwData
, dwSize
;
2013 /* If shell32 exports DllGetVersion(), the browser is integrated */
2014 GET_FUNC(pDllGetVersion
, shell32
, "DllGetVersion", 1);
2015 dwState
= pDllGetVersion
? 2 : 1;
2017 /* Set or delete the key accordinly */
2018 dwRet
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
,
2019 "Software\\Microsoft\\Internet Explorer", 0,
2020 KEY_ALL_ACCESS
, &hKey
);
2023 dwRet
= RegQueryValueExA(hKey
, szIntegratedBrowser
, 0, 0,
2024 (LPBYTE
)&dwData
, &dwSize
);
2026 if (!dwRet
&& dwState
== 1)
2028 /* Value exists but browser is not integrated */
2029 RegDeleteValueA(hKey
, szIntegratedBrowser
);
2031 else if (dwRet
&& dwState
== 2)
2033 /* Browser is integrated but value does not exist */
2035 RegSetValueExA(hKey
, szIntegratedBrowser
, 0, REG_DWORD
,
2036 (LPBYTE
)&dwData
, sizeof(dwData
));
2043 /*************************************************************************
2047 HWND WINAPI
SHLWAPI_278 (
2058 char * clsname
= "WorkerA";
2060 FIXME("(0x%08lx %p 0x%08lx 0x%08lx %p 0x%08lx) partial stub\n",
2061 wndProc
,hWndParent
,dwExStyle
,dwStyle
,hMenu
,z
);
2063 hCursor
= LoadCursorA(0x00000000,IDC_ARROWA
);
2065 if(!GetClassInfoA(shlwapi_hInstance
, clsname
, &wndclass
))
2067 RtlZeroMemory(&wndclass
, sizeof(WNDCLASSA
));
2068 wndclass
.lpfnWndProc
= DefWindowProcW
;
2069 wndclass
.cbWndExtra
= 4;
2070 wndclass
.hInstance
= shlwapi_hInstance
;
2071 wndclass
.hCursor
= hCursor
;
2072 wndclass
.hbrBackground
= (HBRUSH
)COLOR_BTNSHADOW
;
2073 wndclass
.lpszMenuName
= NULL
;
2074 wndclass
.lpszClassName
= clsname
;
2075 RegisterClassA (&wndclass
);
2077 hwnd
= CreateWindowExA(dwExStyle
, clsname
, 0,dwStyle
,0,0,0,0,hWndParent
,
2078 hMenu
,shlwapi_hInstance
,0);
2079 SetWindowLongA(hwnd
, 0, z
);
2080 SetWindowLongA(hwnd
, GWL_WNDPROC
, wndProc
);
2084 /*************************************************************************
2087 * _SHPackDispParamsV
2089 HRESULT WINAPI
SHLWAPI_281(LPVOID w
, LPVOID x
, LPVOID y
, LPVOID z
)
2091 FIXME("%p %p %p %p\n",w
,x
,y
,z
);
2095 /*************************************************************************
2098 * This function seems to be a forward to SHLWAPI.281 (whatever THAT
2099 * function does...).
2101 HRESULT WINAPI
SHLWAPI_282(LPVOID w
, LPVOID x
, LPVOID y
, LPVOID z
)
2103 FIXME("%p %p %p %p\n", w
, x
, y
, z
);
2107 /*************************************************************************
2110 * _IConnectionPoint_SimpleInvoke
2112 DWORD WINAPI
SHLWAPI_284 (
2117 TRACE("(%p %p %p) stub\n",x
,y
,z
);
2121 /*************************************************************************
2124 * _IUnknown_CPContainerOnChanged
2126 HRESULT WINAPI
SHLWAPI_287(LPVOID x
, LPVOID y
)
2128 FIXME("%p %p\n", x
,y
);
2132 /*************************************************************************
2135 * Late bound call to winmm.PlaySoundW
2137 BOOL WINAPI
SHLWAPI_289(LPCWSTR pszSound
, HMODULE hmod
, DWORD fdwSound
)
2139 GET_FUNC(pPlaySoundW
, winmm
, "PlaySoundW", FALSE
);
2140 return pPlaySoundW(pszSound
, hmod
, fdwSound
);
2143 /*************************************************************************
2146 BOOL WINAPI
SHLWAPI_294(LPSTR str1
, LPSTR str2
, LPSTR pStr
, DWORD some_len
, LPCSTR lpStr2
)
2149 * str1: "I" "I" pushl esp+0x20
2150 * str2: "U" "I" pushl 0x77c93810
2151 * (is "I" and "U" "integer" and "unsigned" ??)
2153 * pStr: "" "" pushl eax
2154 * some_len: 0x824 0x104 pushl 0x824
2155 * lpStr2: "%l" "%l" pushl esp+0xc
2157 * shlwapi. StrCpyNW(lpStr2, irrelevant_var, 0x104);
2158 * LocalAlloc(0x00, some_len) -> irrelevant_var
2159 * LocalAlloc(0x40, irrelevant_len) -> pStr
2160 * shlwapi.294(str1, str2, pStr, some_len, lpStr2);
2161 * shlwapi.PathRemoveBlanksW(pStr);
2163 FIXME("('%s', '%s', '%s', %08lx, '%s'): stub!\n", str1
, str2
, pStr
, some_len
, lpStr2
);
2167 /*************************************************************************
2170 * Called by ICQ2000b install via SHDOCVW:
2171 * str1: "InternetShortcut"
2172 * x: some unknown pointer
2173 * str2: "http://free.aol.com/tryaolfree/index.adp?139269"
2174 * str3: "C:\\WINDOWS\\Desktop.new2\\Free AOL & Unlimited Internet.url"
2176 * In short: this one maybe creates a desktop link :-)
2178 BOOL WINAPI
SHLWAPI_295(LPWSTR str1
, LPVOID x
, LPWSTR str2
, LPWSTR str3
)
2180 FIXME("('%s', %p, '%s', '%s'), stub.\n", debugstr_w(str1
), x
, debugstr_w(str2
), debugstr_w(str3
));
2184 /*************************************************************************
2187 * Late bound call to comctl32.417
2189 BOOL WINAPI
SHLWAPI_299(HDC hdc
, INT x
, INT y
, UINT flags
, const RECT
*lprect
,
2190 LPCWSTR str
, UINT count
, const INT
*lpDx
)
2192 GET_FUNC(pCOMCTL32_417
, comctl32
, (LPCSTR
)417, FALSE
);
2193 return pCOMCTL32_417(hdc
, x
, y
, flags
, lprect
, str
, count
, lpDx
);
2196 /*************************************************************************
2199 * Late bound call to shell32.SHGetFileInfoW
2201 DWORD WINAPI
SHLWAPI_313(LPCWSTR path
, DWORD dwFileAttributes
,
2202 SHFILEINFOW
*psfi
, UINT sizeofpsfi
, UINT flags
)
2204 GET_FUNC(pSHGetFileInfoW
, shell32
, "SHGetFileInfoW", 0);
2205 return pSHGetFileInfoW(path
, dwFileAttributes
, psfi
, sizeofpsfi
, flags
);
2208 /*************************************************************************
2211 * Late bound call to shell32.DragQueryFileW
2213 UINT WINAPI
SHLWAPI_318(HDROP hDrop
, UINT lFile
, LPWSTR lpszFile
, UINT lLength
)
2215 GET_FUNC(pDragQueryFileW
, shell32
, "DragQueryFileW", 0);
2216 return pDragQueryFileW(hDrop
, lFile
, lpszFile
, lLength
);
2219 /*************************************************************************
2222 * Late bound call to shell32.SHBrowseForFolderW
2224 LPITEMIDLIST WINAPI
SHLWAPI_333(LPBROWSEINFOW lpBi
)
2226 GET_FUNC(pSHBrowseForFolderW
, shell32
, "SHBrowseForFolderW", NULL
);
2227 return pSHBrowseForFolderW(lpBi
);
2230 /*************************************************************************
2233 * Late bound call to shell32.SHGetPathFromIDListW
2235 BOOL WINAPI
SHLWAPI_334(LPCITEMIDLIST pidl
,LPWSTR pszPath
)
2237 GET_FUNC(pSHGetPathFromIDListW
, shell32
, "SHGetPathFromIDListW", 0);
2238 return pSHGetPathFromIDListW(pidl
, pszPath
);
2241 /*************************************************************************
2244 * Late bound call to shell32.ShellExecuteExW
2246 BOOL WINAPI
SHLWAPI_335(LPSHELLEXECUTEINFOW lpExecInfo
)
2248 GET_FUNC(pShellExecuteExW
, shell32
, "ShellExecuteExW", FALSE
);
2249 return pShellExecuteExW(lpExecInfo
);
2252 /*************************************************************************
2255 * Late bound call to shell32.SHFileOperationW.
2257 HICON WINAPI
SHLWAPI_336(LPSHFILEOPSTRUCTW lpFileOp
)
2259 GET_FUNC(pSHFileOperationW
, shell32
, "SHFileOperationW", 0);
2260 return pSHFileOperationW(lpFileOp
);
2263 /*************************************************************************
2266 * Late bound call to shell32.ExtractIconExW.
2268 UINT WINAPI
SHLWAPI_337(LPCWSTR lpszFile
, INT nIconIndex
, HICON
*phiconLarge
,
2269 HICON
*phiconSmall
, UINT nIcons
)
2271 GET_FUNC(pExtractIconExW
, shell32
, "ExtractIconExW", 0);
2272 return pExtractIconExW(lpszFile
, nIconIndex
, phiconLarge
, phiconSmall
, nIcons
);
2275 /*************************************************************************
2279 LONG WINAPI
SHInterlockedCompareExchange( PLONG dest
, LONG xchg
, LONG compare
)
2281 return InterlockedCompareExchange(dest
, xchg
, compare
);
2284 /*************************************************************************
2287 DWORD WINAPI
SHLWAPI_346 (
2292 FIXME("(%s %p 0x%08x)stub\n",debugstr_w(src
),dest
,len
);
2293 lstrcpynW(dest
, src
, len
);
2294 return lstrlenW(dest
)+1;
2297 /*************************************************************************
2300 * seems to be late bound call to GetFileVersionInfoSizeW
2302 DWORD WINAPI
SHLWAPI_350 (
2308 GET_FUNC(pGetFileVersionInfoSizeW
, version
, "GetFileVersionInfoSizeW", 0);
2309 ret
= pGetFileVersionInfoSizeW(x
, y
);
2313 /*************************************************************************
2316 * seems to be late bound call to GetFileVersionInfoW
2318 BOOL WINAPI
SHLWAPI_351 (
2319 LPWSTR w
, /* [in] path to dll */
2320 DWORD x
, /* [in] parm 2 to GetFileVersionInfoA */
2321 DWORD y
, /* [in] return value from .350 - assume length */
2322 LPVOID z
) /* [in/out] buffer (+0x208 sent to GetFileVersionInfoA) */
2324 GET_FUNC(pGetFileVersionInfoW
, version
, "GetFileVersionInfoW", 0);
2325 return pGetFileVersionInfoW(w
, x
, y
-0x208, (char*)z
+0x208);
2328 /*************************************************************************
2331 * seems to be late bound call to VerQueryValueW
2333 WORD WINAPI
SHLWAPI_352 (
2334 LPVOID w
, /* [in] buffer from _351 */
2335 LPWSTR x
, /* [in] value to retrieve -
2336 converted and passed to VerQueryValueA as #2 */
2337 LPVOID y
, /* [out] ver buffer - passed to VerQueryValueA as #3 */
2338 UINT
* z
) /* [in] ver length - passed to VerQueryValueA as #4 */
2340 GET_FUNC(pVerQueryValueW
, version
, "VerQueryValueW", 0);
2341 return pVerQueryValueW((char*)w
+0x208, x
, y
, z
);
2344 /*************************************************************************
2347 * Late bound call to shell32.SHGetNewLinkInfoW
2349 BOOL WINAPI
SHLWAPI_357(LPCWSTR pszLinkTo
, LPCWSTR pszDir
, LPWSTR pszName
,
2350 BOOL
*pfMustCopy
, UINT uFlags
)
2352 GET_FUNC(pSHGetNewLinkInfoW
, shell32
, "SHGetNewLinkInfoW", FALSE
);
2353 return pSHGetNewLinkInfoW(pszLinkTo
, pszDir
, pszName
, pfMustCopy
, uFlags
);
2356 /*************************************************************************
2359 * Late bound call to shell32.SHDefExtractIconW
2361 UINT WINAPI
SHLWAPI_358(LPCWSTR pszIconFile
, int iIndex
, UINT uFlags
, HICON
* phiconLarge
,
2362 HICON
* phiconSmall
, UINT nIconSize
)
2364 GET_FUNC(pSHDefExtractIconW
, shell32
, "SHDefExtractIconW", 0);
2365 return pSHDefExtractIconW(pszIconFile
, iIndex
, uFlags
, phiconLarge
, phiconSmall
, nIconSize
);
2368 /*************************************************************************
2371 * Wrapper for lstrcpynA with src and dst swapped.
2373 DWORD WINAPI
SHLWAPI_364(LPCSTR src
, LPSTR dst
, INT n
)
2375 lstrcpynA(dst
, src
, n
);
2379 /*************************************************************************
2382 * Late bound call to shell32.ExtractIconW
2384 HICON WINAPI
SHLWAPI_370(HINSTANCE hInstance
, LPCWSTR lpszExeFileName
,
2387 GET_FUNC(pExtractIconW
, shell32
, "ExtractIconW", NULL
);
2388 return pExtractIconW(hInstance
, lpszExeFileName
, nIconIndex
);
2391 /*************************************************************************
2394 LANGID WINAPI
SHLWAPI_376 ()
2397 /* FIXME: This should be a forward in the .spec file to the win2k function
2398 * kernel32.GetUserDefaultUILanguage, however that function isn't there yet.
2400 return GetUserDefaultLangID();
2403 /*************************************************************************
2406 * FIXME: Native appears to do DPA_Create and a DPA_InsertPtr for
2408 * FIXME: Native shows calls to:
2409 * SHRegGetUSValue for "Software\Microsoft\Internet Explorer\International"
2411 * RegOpenKeyExA for "HKLM\Software\Microsoft\Internet Explorer"
2412 * RegQueryValueExA for "LPKInstalled"
2414 * RegOpenKeyExA for "HKCU\Software\Microsoft\Internet Explorer\International"
2415 * RegQueryValueExA for "ResourceLocale"
2417 * RegOpenKeyExA for "HKLM\Software\Microsoft\Active Setup\Installed Components\{guid}"
2418 * RegQueryValueExA for "Locale"
2420 * and then tests the Locale ("en" for me).
2422 * after the code then a DPA_Create (first time) and DPA_InsertPtr are done.
2424 DWORD WINAPI
SHLWAPI_377 (LPCSTR new_mod
, HMODULE inst_hwnd
, LPVOID z
)
2426 CHAR mod_path
[2*MAX_PATH
];
2429 GetModuleFileNameA(inst_hwnd
, mod_path
, 2*MAX_PATH
);
2430 ptr
= strrchr(mod_path
, '\\');
2432 strcpy(ptr
+1, new_mod
);
2433 TRACE("loading %s\n", debugstr_a(mod_path
));
2434 return (DWORD
)LoadLibraryA(mod_path
);
2439 /*************************************************************************
2442 * This is Unicode version of .377
2444 DWORD WINAPI
SHLWAPI_378 (
2445 LPCWSTR new_mod
, /* [in] new module name */
2446 HMODULE inst_hwnd
, /* [in] calling module handle */
2447 LPVOID z
) /* [???] 4 */
2449 WCHAR mod_path
[2*MAX_PATH
];
2452 GetModuleFileNameW(inst_hwnd
, mod_path
, 2*MAX_PATH
);
2453 ptr
= strrchrW(mod_path
, '\\');
2455 strcpyW(ptr
+1, new_mod
);
2456 TRACE("loading %s\n", debugstr_w(mod_path
));
2457 return (DWORD
)LoadLibraryW(mod_path
);
2462 /*************************************************************************
2465 * Late bound call to comdlg32.GetSaveFileNameW
2467 BOOL WINAPI
SHLWAPI_389(LPOPENFILENAMEW ofn
)
2469 GET_FUNC(pGetSaveFileNameW
, comdlg32
, "GetSaveFileNameW", FALSE
);
2470 return pGetSaveFileNameW(ofn
);
2473 /*************************************************************************
2476 * Late bound call to mpr.WNetRestoreConnectionW
2478 DWORD WINAPI
SHLWAPI_390(HWND hwndOwner
, LPWSTR lpszDevice
)
2480 GET_FUNC(pWNetRestoreConnectionW
, mpr
, "WNetRestoreConnectionW", 0);
2481 return pWNetRestoreConnectionW(hwndOwner
, lpszDevice
);
2484 /*************************************************************************
2487 * Late bound call to mpr.WNetGetLastErrorW
2489 DWORD WINAPI
SHLWAPI_391(LPDWORD lpError
, LPWSTR lpErrorBuf
, DWORD nErrorBufSize
,
2490 LPWSTR lpNameBuf
, DWORD nNameBufSize
)
2492 GET_FUNC(pWNetGetLastErrorW
, mpr
, "WNetGetLastErrorW", 0);
2493 return pWNetGetLastErrorW(lpError
, lpErrorBuf
, nErrorBufSize
, lpNameBuf
, nNameBufSize
);
2496 /*************************************************************************
2499 * Late bound call to comdlg32.PageSetupDlgW
2501 BOOL WINAPI
SHLWAPI_401(LPPAGESETUPDLGW pagedlg
)
2503 GET_FUNC(pPageSetupDlgW
, comdlg32
, "PageSetupDlgW", FALSE
);
2504 return pPageSetupDlgW(pagedlg
);
2507 /*************************************************************************
2510 * Late bound call to comdlg32.PrintDlgW
2512 BOOL WINAPI
SHLWAPI_402(LPPRINTDLGW printdlg
)
2514 GET_FUNC(pPrintDlgW
, comdlg32
, "PrintDlgW", FALSE
);
2515 return pPrintDlgW(printdlg
);
2518 /*************************************************************************
2521 * Late bound call to comdlg32.GetOpenFileNameW
2523 BOOL WINAPI
SHLWAPI_403(LPOPENFILENAMEW ofn
)
2525 GET_FUNC(pGetOpenFileNameW
, comdlg32
, "GetOpenFileNameW", FALSE
);
2526 return pGetOpenFileNameW(ofn
);
2529 /* INTERNAL: Map from HLS color space to RGB */
2530 static WORD
ConvertHue(int wHue
, WORD wMid1
, WORD wMid2
)
2532 wHue
= wHue
> 240 ? wHue
- 240 : wHue
< 0 ? wHue
+ 240 : wHue
;
2536 else if (wHue
> 120)
2541 return ((wHue
* (wMid2
- wMid1
) + 20) / 40) + wMid1
;
2544 /* Convert to RGB and scale into RGB range (0..255) */
2545 #define GET_RGB(h) (ConvertHue(h, wMid1, wMid2) * 255 + 120) / 240
2547 /*************************************************************************
2548 * ColorHLSToRGB [SHLWAPI.404]
2550 * Convert from HLS color space into an RGB COLORREF.
2553 * Input HLS values are constrained to the range (0..240).
2555 COLORREF WINAPI
ColorHLSToRGB(WORD wHue
, WORD wLuminosity
, WORD wSaturation
)
2561 WORD wGreen
, wBlue
, wMid1
, wMid2
;
2563 if (wLuminosity
> 120)
2564 wMid2
= wSaturation
+ wLuminosity
- (wSaturation
* wLuminosity
+ 120) / 240;
2566 wMid2
= ((wSaturation
+ 240) * wLuminosity
+ 120) / 240;
2568 wMid1
= wLuminosity
* 2 - wMid2
;
2570 wRed
= GET_RGB(wHue
+ 80);
2571 wGreen
= GET_RGB(wHue
);
2572 wBlue
= GET_RGB(wHue
- 80);
2574 return RGB(wRed
, wGreen
, wBlue
);
2577 wRed
= wLuminosity
* 255 / 240;
2578 return RGB(wRed
, wRed
, wRed
);
2581 /*************************************************************************
2584 DWORD WINAPI
SHLWAPI_406(LPVOID u
, LPVOID v
, LPVOID w
, LPVOID x
, LPVOID y
, LPVOID z
)
2586 FIXME("%p %p %p %p %p %p\n", u
, v
, w
, x
, y
, z
);
2590 /*************************************************************************
2593 * Function unknown seems to always to return 0
2596 DWORD WINAPI
SHLWAPI_413 (DWORD x
)
2598 FIXME("(0x%08lx)stub\n", x
);
2602 /*************************************************************************
2605 * Function seems to do FreeLibrary plus other things.
2607 * FIXME native shows the following calls:
2608 * RtlEnterCriticalSection
2610 * GetProcAddress(Comctl32??, 150L)
2612 * RtlLeaveCriticalSection
2613 * followed by the FreeLibrary.
2614 * The above code may be related to .377 above.
2616 BOOL WINAPI
SHLWAPI_418 (HMODULE x
)
2618 FIXME("(0x%08lx) partial stub\n", (LONG
)x
);
2619 return FreeLibrary(x
);
2622 /*************************************************************************
2625 DWORD WINAPI
SHLWAPI_430 (HINSTANCE hModule
, HANDLE heap
)
2627 FIXME("(0x%08lx 0x%08lx) stub\n", (DWORD
)hModule
, (DWORD
)heap
);
2628 return E_FAIL
; /* This is what is used if shlwapi not loaded */
2631 /*************************************************************************
2634 DWORD WINAPI
SHLWAPI_431 (DWORD x
)
2636 FIXME("(0x%08lx)stub\n", x
);
2640 /*************************************************************************
2643 * This is really CLSIDFromString which is exported by ole32.dll,
2644 * however the native shlwapi.dll does *not* import ole32. Nor does
2645 * ole32.dll import this ordinal from shlwapi. Therefore we must conclude
2646 * that MS duplicated the code for CLSIDFromString.
2648 * This is a duplicate (with changes for UNICODE) of CLSIDFromString16
2649 * in dlls/ole32/compobj.c
2651 DWORD WINAPI
SHLWAPI_436 (LPWSTR idstr
, CLSID
*id
)
2659 memset(s
, 0, sizeof(CLSID
));
2662 else { /* validate the CLSID string */
2664 if (strlenW(s
) != 38)
2665 return CO_E_CLASSSTRING
;
2667 if ((s
[0]!=L
'{') || (s
[9]!=L
'-') || (s
[14]!=L
'-') || (s
[19]!=L
'-') || (s
[24]!=L
'-') || (s
[37]!=L
'}'))
2668 return CO_E_CLASSSTRING
;
2670 for (i
=1; i
<37; i
++)
2672 if ((i
== 9)||(i
== 14)||(i
== 19)||(i
== 24)) continue;
2673 if (!(((s
[i
] >= L
'0') && (s
[i
] <= L
'9')) ||
2674 ((s
[i
] >= L
'a') && (s
[i
] <= L
'f')) ||
2675 ((s
[i
] >= L
'A') && (s
[i
] <= L
'F')))
2677 return CO_E_CLASSSTRING
;
2681 TRACE("%s -> %p\n", debugstr_w(s
), id
);
2683 /* quick lookup table */
2684 memset(table
, 0, 256*sizeof(WCHAR
));
2686 for (i
= 0; i
< 10; i
++) {
2689 for (i
= 0; i
< 6; i
++) {
2690 table
['A' + i
] = i
+10;
2691 table
['a' + i
] = i
+10;
2694 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
2698 s
++; /* skip leading brace */
2699 for (i
= 0; i
< 4; i
++) {
2700 p
[3 - i
] = table
[*s
]<<4 | table
[*(s
+1)];
2706 for (i
= 0; i
< 2; i
++) {
2707 p
[1-i
] = table
[*s
]<<4 | table
[*(s
+1)];
2713 for (i
= 0; i
< 2; i
++) {
2714 p
[1-i
] = table
[*s
]<<4 | table
[*(s
+1)];
2720 /* these are just sequential bytes */
2721 for (i
= 0; i
< 2; i
++) {
2722 *p
++ = table
[*s
]<<4 | table
[*(s
+1)];
2727 for (i
= 0; i
< 6; i
++) {
2728 *p
++ = table
[*s
]<<4 | table
[*(s
+1)];
2735 /*************************************************************************
2738 * Determine if the OS supports a given feature.
2741 * dwFeature [I] Feature requested (undocumented)
2744 * TRUE If the feature is available.
2745 * FALSE If the feature is not available.
2747 DWORD WINAPI
SHLWAPI_437 (DWORD feature
)
2749 FIXME("(0x%08lx) stub\n", feature
);
2753 /*************************************************************************
2754 * ColorRGBToHLS [SHLWAPI.445]
2756 * Convert from RGB COLORREF into the HLS color space.
2759 * Input HLS values are constrained to the range (0..240).
2761 VOID WINAPI
ColorRGBToHLS(COLORREF drRGB
, LPWORD pwHue
,
2762 LPWORD wLuminance
, LPWORD pwSaturation
)
2768 /*************************************************************************
2769 * SHCreateShellPalette [SHLWAPI.@]
2771 HPALETTE WINAPI
SHCreateShellPalette(HDC hdc
)
2774 return CreateHalftonePalette(hdc
);
2777 /*************************************************************************
2778 * SHGetInverseCMAP (SHLWAPI.@)
2780 DWORD WINAPI
SHGetInverseCMAP (LPDWORD
* x
, DWORD why
)
2783 FIXME(" - returning bogus address for SHGetInverseCMAP\n");
2784 *x
= (LPDWORD
)0xabba1249;
2787 FIXME("(%p, %#lx)stub\n", x
, why
);
2791 /*************************************************************************
2792 * SHIsLowMemoryMachine [SHLWAPI.@]
2794 DWORD WINAPI
SHIsLowMemoryMachine (DWORD x
)
2796 FIXME("0x%08lx\n", x
);
2800 /*************************************************************************
2801 * GetMenuPosFromID [SHLWAPI.@]
2803 INT WINAPI
GetMenuPosFromID(HMENU hMenu
, UINT wID
)
2806 INT nCount
= GetMenuItemCount(hMenu
), nIter
= 0;
2808 while (nIter
< nCount
)
2811 if (!GetMenuItemInfoA(hMenu
, nIter
, TRUE
, &mi
) && mi
.wID
== wID
)
2818 /*************************************************************************
2819 * SHSkipJunction [SHLWAPI.@]
2821 * Determine if a bind context can be bound to an object
2824 * pbc [I] Bind context to check
2825 * pclsid [I] CLSID of object to be bound to
2828 * TRUE: If it is safe to bind
2829 * FALSE: If pbc is invalid or binding would not be safe
2832 BOOL WINAPI
SHSkipJunction(IBindCtx
*pbc
, const CLSID
*pclsid
)
2834 static WCHAR szSkipBinding
[] = { 'S','k','i','p',' ',
2835 'B','i','n','d','i','n','g',' ','C','L','S','I','D','\0' };
2842 if (SUCCEEDED(IBindCtx_GetObjectParam(pbc
, szSkipBinding
, &lpUnk
)))
2846 if (SUCCEEDED(SHLWAPI_175(lpUnk
, &clsid
)) &&
2847 IsEqualGUID(pclsid
, &clsid
))
2850 IUnknown_Release(lpUnk
);