1371 lines
35 KiB
C
1371 lines
35 KiB
C
/*
|
|
* SHLWAPI ordinal functions
|
|
*
|
|
* Copyright 1997 Marcus Meissner
|
|
* 1998 Jürgen Schmied
|
|
* 2001 Jon Griffiths
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "windef.h"
|
|
#include "winnls.h"
|
|
#include "winbase.h"
|
|
#include "ddeml.h"
|
|
#include "shlobj.h"
|
|
#include "shellapi.h"
|
|
#include "commdlg.h"
|
|
#include "wine/unicode.h"
|
|
#include "wine/obj_base.h"
|
|
#include "wingdi.h"
|
|
#include "winreg.h"
|
|
#include "winuser.h"
|
|
#include "debugtools.h"
|
|
|
|
DEFAULT_DEBUG_CHANNEL(shell);
|
|
|
|
extern HINSTANCE shlwapi_hInstance;
|
|
extern HMODULE SHLWAPI_hshell32;
|
|
extern HMODULE SHLWAPI_hwinmm;
|
|
extern HMODULE SHLWAPI_hcomdlg32;
|
|
extern HMODULE SHLWAPI_hmpr;
|
|
extern HMODULE SHLWAPI_hmlang;
|
|
|
|
typedef struct {
|
|
INT size; /* [in] (always 0x18) */
|
|
LPCWSTR ap1; /* [out] start of area (maybe after spaces) */
|
|
INT sizep1; /* [out] size of first part (until colon) */
|
|
LPCWSTR ap2; /* [out] pointer following first colon */
|
|
INT sizep2; /* [out] size of remainder */
|
|
INT fcncde; /* [out] function match of p1 (0 if unknown) */
|
|
} UNKNOWN_SHLWAPI_2;
|
|
|
|
typedef struct {
|
|
INT protocol_number;
|
|
LPCSTR protocol_name;
|
|
} SHL_2_inet_protocol;
|
|
|
|
/* The following protocols were identified in the native version of
|
|
* SHLWAPI.DLL version 5.50
|
|
*/
|
|
static const SHL_2_inet_protocol shlwapi_protocols[] = {
|
|
{1, "ftp"},
|
|
{2, "http"},
|
|
{3, "gopher"},
|
|
{4, "mailto"},
|
|
{5, "news"},
|
|
{6, "nntp"},
|
|
{7, "telnet"},
|
|
{8, "wais"},
|
|
{9, "file"},
|
|
{10, "mk"},
|
|
{11, "https"},
|
|
{12, "shell"},
|
|
{13, "snews"},
|
|
{14, "local"},
|
|
{15, "javascript"},
|
|
{16, "vbscript"},
|
|
{17, "about"},
|
|
{18, "res"},
|
|
{0, 0}
|
|
};
|
|
|
|
/* Macro to get function pointer for a module*/
|
|
#define GET_FUNC(module, name, fail) \
|
|
if (!SHLWAPI_h##module) SHLWAPI_h##module = LoadLibraryA(#module ".dll"); \
|
|
if (!SHLWAPI_h##module) return fail; \
|
|
if (!pfnFunc) pfnFunc = (void*)GetProcAddress(SHLWAPI_h##module, name); \
|
|
if (!pfnFunc) return fail
|
|
|
|
/*
|
|
NOTES: Most functions exported by ordinal seem to be superflous.
|
|
The reason for these functions to be there is to provide a wraper
|
|
for unicode functions to provide these functions on systems without
|
|
unicode functions eg. win95/win98. Since we have such functions we just
|
|
call these. If running Wine with native DLL's, some late bound calls may
|
|
fail. However, its better to implement the functions in the forward DLL
|
|
and recommend the builtin rather than reimplementing the calls here!
|
|
*/
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.1]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_1 (
|
|
LPSTR lpStr,
|
|
LPVOID x)
|
|
{
|
|
FIXME("(%p %s %p %s)\n",lpStr, debugstr_a(lpStr),x, debugstr_a(x));
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.2]
|
|
*
|
|
* Identifies the Internet "protocol" requested in the passed string.
|
|
* Also determines start and length of item after the ':'
|
|
*/
|
|
DWORD WINAPI SHLWAPI_2 (LPCWSTR x, UNKNOWN_SHLWAPI_2 *y)
|
|
{
|
|
DWORD cnt;
|
|
const SHL_2_inet_protocol *inet_pro;
|
|
LPSTR cmpstr;
|
|
INT len;
|
|
|
|
if (y->size != 0x18) return E_INVALIDARG;
|
|
/* FIXME: leading white space generates error of 0x80041001 which
|
|
* is undefined
|
|
*/
|
|
if (*x <= L' ') return 0x80041001;
|
|
cnt = 0;
|
|
y->sizep1 = 0;
|
|
y->ap1 = x;
|
|
while (*x) {
|
|
if (*x == L':') {
|
|
y->sizep1 = cnt;
|
|
cnt = -1;
|
|
y->ap2 = x+1;
|
|
break;
|
|
}
|
|
x++;
|
|
cnt++;
|
|
}
|
|
if (*x && y->sizep1) {
|
|
y->sizep2 = lstrlenW(y->ap2);
|
|
}
|
|
|
|
len = WideCharToMultiByte(0, 0, y->ap1, y->sizep1, 0, 0, 0, 0);
|
|
cmpstr = (LPSTR)HeapAlloc(GetProcessHeap(), 0, len+1);
|
|
WideCharToMultiByte(0, 0, y->ap1, y->sizep1, cmpstr, len+1, 0, 0);
|
|
y->fcncde = 0;
|
|
inet_pro = shlwapi_protocols;
|
|
while (inet_pro->protocol_number) {
|
|
if (!strncasecmp(inet_pro->protocol_name, cmpstr,
|
|
min(len, lstrlenA(inet_pro->protocol_name)))) {
|
|
y->fcncde = inet_pro->protocol_number;
|
|
break;
|
|
}
|
|
inet_pro++;
|
|
}
|
|
HeapFree(GetProcessHeap(), 0, cmpstr);
|
|
return S_OK;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_15 [SHLWAPI.15]
|
|
*
|
|
* Function:
|
|
* Retrieves IE "AcceptLanguage" value from registry
|
|
*
|
|
*/
|
|
HRESULT WINAPI SHLWAPI_15 (
|
|
LPWSTR langbuf,
|
|
LPDWORD buflen)
|
|
{
|
|
CHAR *mystr;
|
|
DWORD mystrlen, mytype;
|
|
HKEY mykey;
|
|
LCID mylcid;
|
|
|
|
mystrlen = *buflen;
|
|
mystr = (CHAR*)HeapAlloc(GetProcessHeap(),
|
|
HEAP_ZERO_MEMORY, mystrlen);
|
|
RegOpenKeyA(HKEY_CURRENT_USER,
|
|
"Software\\Microsoft\\Internet Explorer\\International",
|
|
&mykey);
|
|
if (RegQueryValueExA(mykey, "AcceptLanguage",
|
|
0, &mytype, mystr, &mystrlen)) {
|
|
mylcid = GetUserDefaultLCID();
|
|
/* somehow the mylcid translates into "en-us"
|
|
* this is similar to "LOCALE_SABBREVLANGNAME"
|
|
* which could be gotten via GetLocaleInfo.
|
|
* The only problem is LOCALE_SABBREVLANGUAGE" is
|
|
* a 3 char string (first 2 are country code and third is
|
|
* letter for "sublanguage", which does not come close to
|
|
* "en-us"
|
|
*/
|
|
lstrcpynA(mystr, "en-us", mystrlen);
|
|
mystrlen = lstrlenA(mystr);
|
|
}
|
|
else {
|
|
/* handle returned string */
|
|
FIXME("missing code\n");
|
|
}
|
|
RegCloseKey(mykey);
|
|
*buflen = MultiByteToWideChar(0, 0, mystr, -1, langbuf, (*buflen)-1);
|
|
HeapFree(GetProcessHeap(), 0, mystr);
|
|
TRACE("language is %s\n", debugstr_w(langbuf));
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.16]
|
|
*/
|
|
HRESULT WINAPI SHLWAPI_16 (
|
|
LPVOID w,
|
|
LPVOID x,
|
|
LPVOID y,
|
|
LPWSTR z)
|
|
{
|
|
FIXME("(%p %p %p %p)stub\n",w,x,y,z);
|
|
return 0xabba1252;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.18]
|
|
*
|
|
* w is pointer to address of callback routine
|
|
* x is pointer to LPVOID to receive address of locally allocated
|
|
* space size 0x14
|
|
* return is 0 (unless out of memory???)
|
|
*
|
|
* related to _21 and _22 below
|
|
* only seen invoked by SHDOCVW
|
|
*/
|
|
LONG WINAPI SHLWAPI_18 (
|
|
LPVOID *w,
|
|
LPVOID x)
|
|
{
|
|
FIXME("(%p %p)stub\n",w,x);
|
|
*w = 0;
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.21]
|
|
*
|
|
* w points to space allocated via .18 above
|
|
* LocalSize is done on it (retrieves 18)
|
|
* LocalReAlloc is done on it to size 8 with LMEM_MOVEABLE & LMEM_ZEROINIT
|
|
* x values seen 0xa0000005
|
|
* returns 1
|
|
*
|
|
* relates to _18 and _22 above and below
|
|
* only seen invoked by SHDOCVW
|
|
*/
|
|
LONG WINAPI SHLWAPI_21 (
|
|
LPVOID w,
|
|
DWORD x)
|
|
{
|
|
FIXME("(%p %lx)stub\n",w,x);
|
|
return 1;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.22]
|
|
*
|
|
* return is 'w' value seen in x is 0xa0000005
|
|
*
|
|
* relates to _18 and _21 above
|
|
* only seen invoked by SHDOCVW
|
|
*/
|
|
LPVOID WINAPI SHLWAPI_22 (
|
|
LPVOID w,
|
|
DWORD x)
|
|
{
|
|
FIXME("(%p %lx)stub\n",w,x);
|
|
return w;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.23]
|
|
*
|
|
* NOTES
|
|
* converts a guid to a string
|
|
* returns strlen(str)
|
|
*/
|
|
DWORD WINAPI SHLWAPI_23 (
|
|
REFGUID guid, /* [in] clsid */
|
|
LPSTR str, /* [out] buffer */
|
|
INT cmax) /* [in] size of buffer */
|
|
{
|
|
char xguid[40];
|
|
|
|
sprintf( xguid, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
|
guid->Data1, guid->Data2, guid->Data3,
|
|
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
|
|
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
|
|
TRACE("(%s %p 0x%08x)stub\n", xguid, str, cmax);
|
|
if (strlen(xguid)>=cmax) return 0;
|
|
strcpy(str,xguid);
|
|
return strlen(xguid) + 1;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.24]
|
|
*
|
|
* NOTES
|
|
* converts a guid to a string
|
|
* returns strlen(str)
|
|
*/
|
|
DWORD WINAPI SHLWAPI_24 (
|
|
REFGUID guid, /* [in] clsid */
|
|
LPWSTR str, /* [out] buffer */
|
|
INT cmax) /* [in] size of buffer */
|
|
{
|
|
char xguid[40];
|
|
|
|
sprintf( xguid, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
|
guid->Data1, guid->Data2, guid->Data3,
|
|
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
|
|
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
|
|
return MultiByteToWideChar( CP_ACP, 0, xguid, -1, str, cmax );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_25 [SHLWAPI.25]
|
|
*
|
|
* Seems to be iswalpha
|
|
*/
|
|
BOOL WINAPI SHLWAPI_25(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_ALPHA) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_26 [SHLWAPI.26]
|
|
*
|
|
* Seems to be iswupper
|
|
*/
|
|
BOOL WINAPI SHLWAPI_26(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_UPPER) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_27 [SHLWAPI.27]
|
|
*
|
|
* Seems to be iswlower
|
|
*/
|
|
BOOL WINAPI SHLWAPI_27(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_LOWER) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_28 [SHLWAPI.28]
|
|
*
|
|
* Seems to be iswalnum
|
|
*/
|
|
BOOL WINAPI SHLWAPI_28(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & (C1_ALPHA|C1_DIGIT)) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_29 [SHLWAPI.29]
|
|
*
|
|
* Seems to be iswspace
|
|
*/
|
|
BOOL WINAPI SHLWAPI_29(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_SPACE) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_30 [SHLWAPI.30]
|
|
*
|
|
* Seems to be iswblank
|
|
*/
|
|
BOOL WINAPI SHLWAPI_30(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_BLANK) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_31 [SHLWAPI.31]
|
|
*
|
|
* Seems to be iswpunct
|
|
*/
|
|
BOOL WINAPI SHLWAPI_31(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_PUNCT) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.32]
|
|
*
|
|
* Seems to be iswcntrl
|
|
*/
|
|
BOOL WINAPI SHLWAPI_32(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_CNTRL) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_33 [SHLWAPI.33]
|
|
*
|
|
* Seems to be iswdigit
|
|
*/
|
|
BOOL WINAPI SHLWAPI_33(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_DIGIT) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_34 [SHLWAPI.34]
|
|
*
|
|
* Seems to be iswxdigit
|
|
*/
|
|
BOOL WINAPI SHLWAPI_34(WCHAR wc)
|
|
{
|
|
return (get_char_typeW(wc) & C1_XDIGIT) != 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHLWAPI_35 [SHLWAPI.35]
|
|
*
|
|
*/
|
|
BOOL WINAPI SHLWAPI_35(LPVOID p1, DWORD dw2, LPVOID p3)
|
|
{
|
|
FIXME("(%p, 0x%08lx, %p): stub\n", p1, dw2, p3);
|
|
return TRUE;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.40]
|
|
*
|
|
* Get pointer to next Unicode character.
|
|
*/
|
|
LPCWSTR WINAPI SHLWAPI_40(LPCWSTR str)
|
|
{
|
|
return *str ? str + 1 : str;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.74]
|
|
*
|
|
* Get the text from a given dialog item.
|
|
*/
|
|
INT WINAPI SHLWAPI_74(HWND hWnd, INT nItem, LPWSTR lpsDest,INT nDestLen)
|
|
{
|
|
HWND hItem = GetDlgItem(hWnd, nItem);
|
|
|
|
if (hItem)
|
|
return GetWindowTextW(hItem, lpsDest, nDestLen);
|
|
if (nDestLen)
|
|
*lpsDest = (WCHAR)'\0';
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.151]
|
|
* Function: Compare two ASCII strings for "len" bytes.
|
|
* Returns: *str1-*str2 (case sensitive)
|
|
*/
|
|
DWORD WINAPI SHLWAPI_151(LPSTR str1, LPSTR str2, INT len)
|
|
{
|
|
return strncmp( str1, str2, len );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.152]
|
|
*
|
|
* Function: Compare two WIDE strings for "len" bytes.
|
|
* Returns: *str1-*str2 (case sensitive)
|
|
*/
|
|
DWORD WINAPI SHLWAPI_152(LPWSTR str1, LPWSTR str2, INT len)
|
|
{
|
|
return strncmpW( str1, str2, len );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.153]
|
|
* Function: Compare two ASCII strings for "len" bytes via caseless compare.
|
|
* Returns: *str1-*str2 (case insensitive)
|
|
*/
|
|
DWORD WINAPI SHLWAPI_153(LPSTR str1, LPSTR str2, DWORD len)
|
|
{
|
|
return strncasecmp( str1, str2, len );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.154]
|
|
*
|
|
* Function: Compare two WIDE strings for "len" bytes via caseless compare.
|
|
* Returns: *str1-*str2 (case insensitive)
|
|
*/
|
|
DWORD WINAPI SHLWAPI_154(LPWSTR str1, LPWSTR str2, DWORD len)
|
|
{
|
|
return strncmpiW( str1, str2, len );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.156]
|
|
*
|
|
* Case sensitive string compare. Does not SetLastError().
|
|
*/
|
|
DWORD WINAPI SHLWAPI_156 ( LPWSTR str1, LPWSTR str2)
|
|
{
|
|
return strcmpW( str1, str2 );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.158]
|
|
*
|
|
* Case insensitive string compare. Does not SetLastError(). ??
|
|
*/
|
|
DWORD WINAPI SHLWAPI_158 ( LPWSTR str1, LPWSTR str2)
|
|
{
|
|
return strcmpiW( str1, str2 );
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.162]
|
|
*
|
|
* Ensure a multibyte character string doesn't end in a hanging lead byte.
|
|
*/
|
|
DWORD WINAPI SHLWAPI_162(LPSTR lpStr, DWORD size)
|
|
{
|
|
if (lpStr && size)
|
|
{
|
|
LPSTR lastByte = lpStr + size - 1;
|
|
|
|
while(lpStr < lastByte)
|
|
lpStr += IsDBCSLeadByte(*lpStr) ? 2 : 1;
|
|
|
|
if(lpStr == lastByte && IsDBCSLeadByte(*lpStr))
|
|
{
|
|
*lpStr = '\0';
|
|
size--;
|
|
}
|
|
return size;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.165]
|
|
*
|
|
* SetWindowLongA with mask.
|
|
*/
|
|
LONG WINAPI SHLWAPI_165(HWND hwnd, INT offset, UINT wFlags, UINT wMask)
|
|
{
|
|
LONG ret = GetWindowLongA(hwnd, offset);
|
|
UINT newFlags = (wFlags & wMask) | (ret & ~wFlags);
|
|
|
|
if (newFlags != ret)
|
|
ret = SetWindowLongA(hwnd, offset, newFlags);
|
|
return ret;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.169]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_169 (IUnknown * lpUnknown)
|
|
{
|
|
TRACE("(%p)\n",lpUnknown);
|
|
#if 0
|
|
if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0;
|
|
return IUnknown_Release(lpUnknown);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.170]
|
|
*
|
|
* Skip URL '//' sequence.
|
|
*/
|
|
LPCSTR WINAPI SHLWAPI_170(LPCSTR lpszSrc)
|
|
{
|
|
if (lpszSrc && lpszSrc[0] == '/' && lpszSrc[1] == '/')
|
|
lpszSrc += 2;
|
|
return lpszSrc;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.181]
|
|
*
|
|
* Enable or disable a menu item.
|
|
*/
|
|
UINT WINAPI SHLWAPI_181(HMENU hMenu, UINT wItemID, BOOL bEnable)
|
|
{
|
|
return EnableMenuItem(hMenu, wItemID, bEnable ? MF_ENABLED : MF_GRAYED);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.183]
|
|
*
|
|
* Register a window class if it isn't already.
|
|
*/
|
|
DWORD WINAPI SHLWAPI_183(WNDCLASSA *wndclass)
|
|
{
|
|
WNDCLASSA wca;
|
|
if (GetClassInfoA(wndclass->hInstance, wndclass->lpszClassName, &wca))
|
|
return TRUE;
|
|
return (DWORD)RegisterClassA(wndclass);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.193]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_193 ()
|
|
{
|
|
HDC hdc;
|
|
DWORD ret;
|
|
|
|
TRACE("()\n");
|
|
|
|
hdc = GetDC(0);
|
|
ret = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
|
|
ReleaseDC(0, hdc);
|
|
return ret;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.215]
|
|
*
|
|
* NOTES
|
|
* check me!
|
|
*/
|
|
LPWSTR WINAPI SHLWAPI_215 (
|
|
LPWSTR lpStrSrc,
|
|
LPVOID lpwStrDest,
|
|
int len)
|
|
{
|
|
WARN("(%p %p %u)\n",lpStrSrc,lpwStrDest,len);
|
|
return strncpyW(lpwStrDest, lpStrSrc, len);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.218]
|
|
*
|
|
* WideCharToMultiByte with multi language support.
|
|
*/
|
|
INT WINAPI SHLWAPI_218(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
|
|
LPINT lpnMultiCharCount)
|
|
{
|
|
static HRESULT (WINAPI *pfnFunc)(LPDWORD,DWORD,LPCWSTR,LPINT,LPSTR,LPINT);
|
|
WCHAR emptyW[] = { '\0' };
|
|
int len , reqLen;
|
|
LPSTR mem;
|
|
|
|
if (!lpDstStr || !lpnMultiCharCount)
|
|
return 0;
|
|
|
|
if (!lpSrcStr)
|
|
lpSrcStr = emptyW;
|
|
|
|
*lpDstStr = '\0';
|
|
|
|
len = strlenW(lpSrcStr) + 1;
|
|
|
|
switch (CodePage)
|
|
{
|
|
case CP_WINUNICODE:
|
|
CodePage = CP_UTF8; /* Fall through... */
|
|
case 0x0000C350: /* FIXME: CP_ #define */
|
|
case CP_UTF7:
|
|
case CP_UTF8:
|
|
{
|
|
DWORD dwMode = 0;
|
|
INT nWideCharCount = len - 1;
|
|
|
|
GET_FUNC(mlang, "ConvertINetUnicodeToMultiByte", 0);
|
|
if (!pfnFunc(&dwMode, CodePage, lpSrcStr, &nWideCharCount, lpDstStr,
|
|
lpnMultiCharCount))
|
|
return 0;
|
|
|
|
if (nWideCharCount < len - 1)
|
|
{
|
|
mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, *lpnMultiCharCount);
|
|
if (!mem)
|
|
return 0;
|
|
|
|
*lpnMultiCharCount = 0;
|
|
|
|
if (pfnFunc(&dwMode, CodePage, lpSrcStr, &len, mem, lpnMultiCharCount))
|
|
{
|
|
SHLWAPI_162 (mem, *lpnMultiCharCount);
|
|
lstrcpynA(lpDstStr, mem, *lpnMultiCharCount + 1);
|
|
return *lpnMultiCharCount + 1;
|
|
}
|
|
HeapFree(GetProcessHeap(), 0, mem);
|
|
return *lpnMultiCharCount;
|
|
}
|
|
lpDstStr[*lpnMultiCharCount] = '\0';
|
|
return *lpnMultiCharCount;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr,
|
|
*lpnMultiCharCount, NULL, NULL);
|
|
|
|
if (!reqLen && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, NULL, 0, NULL, NULL);
|
|
if (reqLen)
|
|
{
|
|
mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, reqLen);
|
|
if (mem)
|
|
{
|
|
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem,
|
|
reqLen, NULL, NULL);
|
|
|
|
reqLen = SHLWAPI_162(mem, *lpnMultiCharCount);
|
|
reqLen++;
|
|
|
|
lstrcpynA(lpDstStr, mem, *lpnMultiCharCount);
|
|
|
|
HeapFree(GetProcessHeap(), 0, mem);
|
|
}
|
|
}
|
|
}
|
|
return reqLen;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.217]
|
|
*
|
|
* Hmm, some program used lpnMultiCharCount == 0x3 (and lpSrcStr was "C")
|
|
* --> Crash. Something wrong here.
|
|
*/
|
|
INT WINAPI SHLWAPI_217(LPCWSTR lpSrcStr, LPSTR lpDstStr, LPINT lpnMultiCharCount)
|
|
{
|
|
return SHLWAPI_218(CP_ACP, lpSrcStr, lpDstStr, lpnMultiCharCount);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.219]
|
|
*
|
|
* NOTES
|
|
* error codes: E_POINTER, E_NOINTERFACE
|
|
*/
|
|
HRESULT WINAPI SHLWAPI_219 (
|
|
LPVOID w, /* [???] NOTE: returned by LocalAlloc, 0x450 bytes, iface */
|
|
LPVOID x, /* [???] */
|
|
REFIID riid, /* [???] e.g. IWebBrowser2 */
|
|
LPWSTR z) /* [???] NOTE: OUT: path */
|
|
{
|
|
FIXME("(%p %s %s %p)stub\n",w,debugstr_a(x),debugstr_guid(riid),z);
|
|
return 0xabba1252;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.222]
|
|
*
|
|
* NOTES
|
|
* securityattributes missing
|
|
*/
|
|
HANDLE WINAPI SHLWAPI_222 (LPCLSID guid)
|
|
{
|
|
char lpstrName[80];
|
|
|
|
sprintf( lpstrName, "shell.{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
|
guid->Data1, guid->Data2, guid->Data3,
|
|
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
|
|
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
|
|
FIXME("(%s) stub\n", lpstrName);
|
|
return CreateSemaphoreA(NULL,0, 0x7fffffff, lpstrName);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.223]
|
|
*
|
|
* NOTES
|
|
* get the count of the semaphore
|
|
*/
|
|
DWORD WINAPI SHLWAPI_223 (HANDLE handle)
|
|
{
|
|
DWORD oldCount;
|
|
|
|
FIXME("(0x%08x) stub\n",handle);
|
|
|
|
ReleaseSemaphore( handle, 1, &oldCount); /* +1 */
|
|
WaitForSingleObject( handle, 0 ); /* -1 */
|
|
return oldCount;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.237]
|
|
*
|
|
* Unicode version of SHLWAPI_183.
|
|
*/
|
|
DWORD WINAPI SHLWAPI_237 (WNDCLASSW * lpWndClass)
|
|
{
|
|
WNDCLASSW WndClass;
|
|
|
|
TRACE("(0x%08x %s)\n",lpWndClass->hInstance, debugstr_w(lpWndClass->lpszClassName));
|
|
|
|
if (GetClassInfoW(lpWndClass->hInstance, lpWndClass->lpszClassName, &WndClass))
|
|
return TRUE;
|
|
return RegisterClassW(lpWndClass);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.240]
|
|
*
|
|
* Calls ASCII or Unicode WindowProc for the given window.
|
|
*/
|
|
LRESULT CALLBACK SHLWAPI_240(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (IsWindowUnicode(hWnd))
|
|
return DefWindowProcW(hWnd, uMessage, wParam, lParam);
|
|
return DefWindowProcA(hWnd, uMessage, wParam, lParam);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.241]
|
|
*
|
|
*/
|
|
DWORD WINAPI SHLWAPI_241 ()
|
|
{
|
|
FIXME("()stub\n");
|
|
return 0xabba1243;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.266]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_266 (
|
|
LPVOID w,
|
|
LPVOID x,
|
|
LPVOID y,
|
|
LPVOID z)
|
|
{
|
|
FIXME("(%p %p %p %p)stub\n",w,x,y,z);
|
|
return 0xabba1248;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.267]
|
|
*/
|
|
HRESULT WINAPI SHLWAPI_267 (
|
|
LPVOID w, /* [???] NOTE: same as 1th parameter of SHLWAPI_219 */
|
|
LPVOID x, /* [???] NOTE: same as 2nd parameter of SHLWAPI_219 */
|
|
LPVOID y,
|
|
LPVOID z)
|
|
{
|
|
FIXME("(%p %p %p %p)stub\n",w,x,y,z);
|
|
*((LPDWORD)z) = 0xabba1200;
|
|
return 0xabba1254;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.268]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_268 (
|
|
LPVOID w,
|
|
LPVOID x)
|
|
{
|
|
FIXME("(%p %p)\n",w,x);
|
|
return 0xabba1251; /* 0 = failure */
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.276]
|
|
*
|
|
*/
|
|
DWORD WINAPI SHLWAPI_276 ()
|
|
{
|
|
FIXME("()stub\n");
|
|
return 0xabba1244;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.278]
|
|
*
|
|
*/
|
|
HWND WINAPI SHLWAPI_278 (
|
|
LONG wndProc,
|
|
HWND hWndParent,
|
|
DWORD dwExStyle,
|
|
DWORD dwStyle,
|
|
HMENU hMenu,
|
|
LONG z)
|
|
{
|
|
WNDCLASSA wndclass;
|
|
HWND hwnd;
|
|
HCURSOR hCursor;
|
|
char * clsname = "WorkerA";
|
|
|
|
FIXME("(0x%08lx 0x%08x 0x%08lx 0x%08lx 0x%08x 0x%08lx)stub\n",
|
|
wndProc,hWndParent,dwExStyle,dwStyle,hMenu,z);
|
|
|
|
hCursor = LoadCursorA(0x00000000,IDC_ARROWA);
|
|
|
|
if(!GetClassInfoA(shlwapi_hInstance, clsname, &wndclass))
|
|
{
|
|
RtlZeroMemory(&wndclass, sizeof(WNDCLASSA));
|
|
wndclass.lpfnWndProc = DefWindowProcW;
|
|
wndclass.cbWndExtra = 4;
|
|
wndclass.hInstance = shlwapi_hInstance;
|
|
wndclass.hCursor = hCursor;
|
|
wndclass.hbrBackground = COLOR_BTNSHADOW;
|
|
wndclass.lpszMenuName = NULL;
|
|
wndclass.lpszClassName = clsname;
|
|
RegisterClassA (&wndclass);
|
|
}
|
|
hwnd = CreateWindowExA(dwExStyle, clsname, 0,dwStyle,0,0,0,0,hWndParent,
|
|
hMenu,shlwapi_hInstance,0);
|
|
SetWindowLongA(hwnd, 0, z);
|
|
SetWindowLongA(hwnd, GWL_WNDPROC, wndProc);
|
|
return hwnd;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.289]
|
|
*
|
|
* Late bound call to winmm.PlaySoundW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_289(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPCWSTR, HMODULE, DWORD) = NULL;
|
|
|
|
GET_FUNC(winmm, "PlaySoundW", FALSE);
|
|
return pfnFunc(pszSound, hmod, fdwSound);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.294]
|
|
*/
|
|
BOOL WINAPI SHLWAPI_294(LPSTR str1, LPSTR str2, LPSTR pStr, DWORD some_len, LPCSTR lpStr2)
|
|
{
|
|
/*
|
|
* str1: "I" "I" pushl esp+0x20
|
|
* str2: "U" "I" pushl 0x77c93810
|
|
* (is "I" and "U" "integer" and "unsigned" ??)
|
|
*
|
|
* pStr: "" "" pushl eax
|
|
* some_len: 0x824 0x104 pushl 0x824
|
|
* lpStr2: "%l" "%l" pushl esp+0xc
|
|
*
|
|
* shlwapi. StrCpyNW(lpStr2, irrelevant_var, 0x104);
|
|
* LocalAlloc(0x00, some_len) -> irrelevant_var
|
|
* LocalAlloc(0x40, irrelevant_len) -> pStr
|
|
* shlwapi.294(str1, str2, pStr, some_len, lpStr2);
|
|
* shlwapi.PathRemoveBlanksW(pStr);
|
|
*/
|
|
ERR("('%s', '%s', '%s', %08lx, '%s'): stub!\n", str1, str2, pStr, some_len, lpStr2);
|
|
return TRUE;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.313]
|
|
*
|
|
* Late bound call to shell32.SHGetFileInfoW
|
|
*/
|
|
DWORD WINAPI SHLWAPI_313(LPCWSTR path, DWORD dwFileAttributes,
|
|
SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
|
|
{
|
|
static DWORD (WINAPI *pfnFunc)(LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHGetFileInfoW", 0);
|
|
return pfnFunc(path, dwFileAttributes, psfi, sizeofpsfi, flags);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.318]
|
|
*
|
|
* Late bound call to shell32.DragQueryFileW
|
|
*/
|
|
UINT WINAPI SHLWAPI_318(HDROP hDrop, UINT lFile, LPWSTR lpszFile, UINT lLength)
|
|
{
|
|
static UINT (WINAPI *pfnFunc)(HDROP, UINT, LPWSTR, UINT) = NULL;
|
|
|
|
GET_FUNC(shell32, "DragQueryFileW", 0);
|
|
return pfnFunc(hDrop, lFile, lpszFile, lLength);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.333]
|
|
*
|
|
* Late bound call to shell32.SHBrowseForFolderW
|
|
*/
|
|
LPITEMIDLIST WINAPI SHLWAPI_333(LPBROWSEINFOW lpBi)
|
|
{
|
|
static LPITEMIDLIST (WINAPI *pfnFunc)(LPBROWSEINFOW) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHBrowseForFolderW", NULL);
|
|
return pfnFunc(lpBi);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.334]
|
|
*
|
|
* Late bound call to shell32.SHGetPathFromIDListW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_334(LPCITEMIDLIST pidl,LPWSTR pszPath)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPCITEMIDLIST, LPWSTR) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHGetPathFromIDListW", 0);
|
|
return pfnFunc(pidl, pszPath);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.335]
|
|
*
|
|
* Late bound call to shell32.ShellExecuteExW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_335(LPSHELLEXECUTEINFOW lpExecInfo)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPSHELLEXECUTEINFOW) = NULL;
|
|
|
|
GET_FUNC(shell32, "ShellExecuteExW", FALSE);
|
|
return pfnFunc(lpExecInfo);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.336]
|
|
*
|
|
* Late bound call to shell32.SHFileOperationW.
|
|
*/
|
|
DWORD WINAPI SHLWAPI_336(LPSHFILEOPSTRUCTW lpFileOp)
|
|
{
|
|
static HICON (WINAPI *pfnFunc)(LPSHFILEOPSTRUCTW) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHFileOperationW", 0);
|
|
return pfnFunc(lpFileOp);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.337]
|
|
*
|
|
* Late bound call to shell32.ExtractIconExW.
|
|
*/
|
|
HICON WINAPI SHLWAPI_337(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge,
|
|
HICON *phiconSmall, UINT nIcons)
|
|
{
|
|
static HICON (WINAPI *pfnFunc)(LPCWSTR, INT,HICON *,HICON *, UINT) = NULL;
|
|
|
|
GET_FUNC(shell32, "ExtractIconExW", (HICON)0);
|
|
return pfnFunc(lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.342]
|
|
*
|
|
*/
|
|
DWORD WINAPI SHLWAPI_342 (
|
|
LPVOID w,
|
|
LPVOID x,
|
|
LPVOID y,
|
|
LPVOID z)
|
|
{
|
|
FIXME("(%p %p %p %p)stub\n",w,x,y,z);
|
|
return 0xabba1249;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.346]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_346 (
|
|
LPCWSTR src,
|
|
LPWSTR dest,
|
|
int len)
|
|
{
|
|
FIXME("(%s %p 0x%08x)stub\n",debugstr_w(src),dest,len);
|
|
lstrcpynW(dest, src, len);
|
|
return lstrlenW(dest)+1;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.357]
|
|
*
|
|
* Late bound call to shell32.SHGetNewLinkInfoW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_357(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName,
|
|
BOOL *pfMustCopy, UINT uFlags)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPCWSTR, LPCWSTR, LPCWSTR, BOOL*, UINT) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHGetNewLinkInfoW", FALSE);
|
|
return pfnFunc(pszLinkTo, pszDir, pszName, pfMustCopy, uFlags);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.358]
|
|
*
|
|
* Late bound call to shell32.SHDefExtractIconW
|
|
*/
|
|
DWORD WINAPI SHLWAPI_358(LPVOID arg1, LPVOID arg2, LPVOID arg3, LPVOID arg4,
|
|
LPVOID arg5, LPVOID arg6)
|
|
{
|
|
/* FIXME: Correct args */
|
|
static DWORD (WINAPI *pfnFunc)(LPVOID, LPVOID, LPVOID, LPVOID, LPVOID, LPVOID) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHDefExtractIconW", 0);
|
|
return pfnFunc(arg1, arg2, arg3, arg4, arg5, arg6);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.364]
|
|
*
|
|
* Wrapper for lstrcpynA with src and dst swapped.
|
|
*/
|
|
DWORD WINAPI SHLWAPI_364(LPCSTR src, LPSTR dst, INT n)
|
|
{
|
|
lstrcpynA(dst, src, n);
|
|
return TRUE;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.370]
|
|
*
|
|
* Late bound call to shell32.ExtractIconW
|
|
*/
|
|
HICON WINAPI SHLWAPI_370(HINSTANCE hInstance, LPCWSTR lpszExeFileName,
|
|
UINT nIconIndex)
|
|
{
|
|
static HICON (WINAPI *pfnFunc)(HINSTANCE, LPCWSTR, UINT) = NULL;
|
|
|
|
GET_FUNC(shell32, "ExtractIconW", (HICON)0);
|
|
return pfnFunc(hInstance, lpszExeFileName, nIconIndex);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.376]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_376 (LONG x)
|
|
{
|
|
FIXME("(0x%08lx)stub\n", x );
|
|
/* FIXME: This should be a forward in the .spec file to the win2k function
|
|
* kernel32.GetUserDefaultUILanguage, however that function isn't there yet.
|
|
*/
|
|
return 0xabba1245;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.377]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_377 (LPVOID x, LPVOID y, LPVOID z)
|
|
{
|
|
FIXME("(%p %p %p)stub\n", x,y,z);
|
|
return 0xabba1246;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.378]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_378 (
|
|
LPSTR x,
|
|
LPVOID y, /* [???] 0x50000000 */
|
|
LPVOID z) /* [???] 4 */
|
|
{
|
|
FIXME("(%s %p %p)stub\n", x,y,z);
|
|
return LoadLibraryA(x);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.389]
|
|
*
|
|
* Late bound call to comdlg32.GetSaveFileNameW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_389(LPOPENFILENAMEW ofn)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPOPENFILENAMEW) = NULL;
|
|
|
|
GET_FUNC(comdlg32, "GetSaveFileNameW", FALSE);
|
|
return pfnFunc(ofn);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.390]
|
|
*
|
|
* Late bound call to mpr.WNetRestoreConnectionW
|
|
*/
|
|
DWORD WINAPI SHLWAPI_390(LPVOID arg1, LPVOID arg2)
|
|
{
|
|
/* FIXME: Correct args */
|
|
static DWORD (WINAPI *pfnFunc)(LPVOID, LPVOID) = NULL;
|
|
|
|
GET_FUNC(mpr, "WNetRestoreConnectionW", 0);
|
|
return pfnFunc(arg1, arg2);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.391]
|
|
*
|
|
* Late bound call to mpr.WNetGetLastErrorW
|
|
*/
|
|
DWORD WINAPI SHLWAPI_391(LPVOID arg1, LPVOID arg2, LPVOID arg3, LPVOID arg4,
|
|
LPVOID arg5)
|
|
{
|
|
/* FIXME: Correct args */
|
|
static DWORD (WINAPI *pfnFunc)(LPVOID, LPVOID, LPVOID, LPVOID, LPVOID) = NULL;
|
|
|
|
GET_FUNC(mpr, "WNetGetLastErrorW", 0);
|
|
return pfnFunc(arg1, arg2, arg3, arg4, arg5);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.401]
|
|
*
|
|
* Late bound call to comdlg32.PageSetupDlgW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_401(LPPAGESETUPDLGW pagedlg)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPPAGESETUPDLGW) = NULL;
|
|
|
|
GET_FUNC(comdlg32, "PageSetupDlgW", FALSE);
|
|
return pfnFunc(pagedlg);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.402]
|
|
*
|
|
* Late bound call to comdlg32.PrintDlgW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_402(LPPRINTDLGW printdlg)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPPRINTDLGW) = NULL;
|
|
|
|
GET_FUNC(comdlg32, "PrintDlgW", FALSE);
|
|
return pfnFunc(printdlg);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.403]
|
|
*
|
|
* Late bound call to comdlg32.GetOpenFileNameW
|
|
*/
|
|
BOOL WINAPI SHLWAPI_403(LPOPENFILENAMEW ofn)
|
|
{
|
|
static BOOL (WINAPI *pfnFunc)(LPOPENFILENAMEW) = NULL;
|
|
|
|
GET_FUNC(comdlg32, "GetOpenFileNameW", FALSE);
|
|
return pfnFunc(ofn);
|
|
}
|
|
|
|
/* INTERNAL: Map from HLS color space to RGB */
|
|
static WORD ConvertHue(int wHue, WORD wMid1, WORD wMid2)
|
|
{
|
|
wHue = wHue > 240 ? wHue - 240 : wHue < 0 ? wHue + 240 : wHue;
|
|
|
|
if (wHue > 160)
|
|
return wMid1;
|
|
else if (wHue > 120)
|
|
wHue = 160 - wHue;
|
|
else if (wHue > 40)
|
|
return wMid2;
|
|
|
|
return ((wHue * (wMid2 - wMid1) + 20) / 40) + wMid1;
|
|
}
|
|
|
|
/* Convert to RGB and scale into RGB range (0..255) */
|
|
#define GET_RGB(h) (ConvertHue(h, wMid1, wMid2) * 255 + 120) / 240
|
|
|
|
/*************************************************************************
|
|
* ColorHLSToRGB [SHLWAPI.404]
|
|
*
|
|
* Convert from HLS color space into an RGB COLORREF.
|
|
*
|
|
* NOTES
|
|
* Input HLS values are constrained to the range (0..240).
|
|
*/
|
|
COLORREF WINAPI ColorHLSToRGB(WORD wHue, WORD wLuminosity, WORD wSaturation)
|
|
{
|
|
WORD wRed;
|
|
|
|
if (wSaturation)
|
|
{
|
|
WORD wGreen, wBlue, wMid1, wMid2;
|
|
|
|
if (wLuminosity > 120)
|
|
wMid2 = wSaturation + wLuminosity - (wSaturation * wLuminosity + 120) / 240;
|
|
else
|
|
wMid2 = ((wSaturation + 240) * wLuminosity + 120) / 240;
|
|
|
|
wMid1 = wLuminosity * 2 - wMid2;
|
|
|
|
wRed = GET_RGB(wHue + 80);
|
|
wGreen = GET_RGB(wHue);
|
|
wBlue = GET_RGB(wHue - 80);
|
|
|
|
return RGB(wRed, wGreen, wBlue);
|
|
}
|
|
|
|
wRed = wLuminosity * 255 / 240;
|
|
return RGB(wRed, wRed, wRed);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.431]
|
|
*/
|
|
DWORD WINAPI SHLWAPI_431 (DWORD x)
|
|
{
|
|
FIXME("(0x%08lx)stub\n", x);
|
|
return 0xabba1247;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* @ [SHLWAPI.437]
|
|
*
|
|
* NOTES
|
|
* In the real shlwapi, One time initialisation calls GetVersionEx and reads
|
|
* the registry to determine what O/S & Service Pack level is running, and
|
|
* therefore which functions are available. Currently we always run as NT,
|
|
* since this means that we don't need extra code to emulate Unicode calls,
|
|
* they are forwarded directly to the appropriate API call instead.
|
|
* Since the flags for whether to call or emulate Unicode are internal to
|
|
* the dll, this function does not need a full implementation.
|
|
*/
|
|
DWORD WINAPI SHLWAPI_437 (DWORD functionToCall)
|
|
{
|
|
FIXME("(0x%08lx)stub\n", functionToCall);
|
|
return 0xabba1247;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHCreateShellPalette [SHLWAPI.@]
|
|
*/
|
|
HPALETTE WINAPI SHCreateShellPalette(HDC hdc)
|
|
{
|
|
FIXME("stub\n");
|
|
return CreateHalftonePalette(hdc);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHGetInverseCMAP (SHLWAPI.@)
|
|
*/
|
|
DWORD WINAPI SHGetInverseCMAP (LPVOID x, DWORD why)
|
|
{
|
|
FIXME("(%p, %#lx)stub\n", x, why);
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* SHIsLowMemoryMachine [SHLWAPI.@]
|
|
*/
|
|
DWORD WINAPI SHIsLowMemoryMachine (DWORD x)
|
|
{
|
|
FIXME("0x%08lx\n", x);
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* GetMenuPosFromID [SHLWAPI.@]
|
|
*/
|
|
INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID)
|
|
{
|
|
MENUITEMINFOA mi;
|
|
INT nCount = GetMenuItemCount(hMenu), nIter = 0;
|
|
|
|
while (nIter < nCount)
|
|
{
|
|
mi.wID = 0;
|
|
if (!GetMenuItemInfoA(hMenu, nIter, TRUE, &mi) && mi.wID == wID)
|
|
return nIter;
|
|
nIter++;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* _SHGetInstanceExplorer@4 [SHLWAPI.@]
|
|
*
|
|
* Late bound call to shell32.SHGetInstanceExplorer.
|
|
*/
|
|
HRESULT WINAPI _SHGetInstanceExplorer (LPUNKNOWN *lpUnknown)
|
|
{
|
|
static HRESULT (WINAPI *pfnFunc)(LPUNKNOWN *) = NULL;
|
|
|
|
GET_FUNC(shell32, "SHGetInstanceExplorer", E_FAIL);
|
|
return pfnFunc(lpUnknown);
|
|
}
|