Commit 00c5250a authored by Jon Griffiths's avatar Jon Griffiths Committed by Alexandre Julliard

Implement SHMessageBoxCheck functions && add dialog resources.

Add SHWaitForSendMessageThread, SHAnsiToUnicodeCP,SHStripMneumonicW, SHSearchMapInt.
parent ca6b0726
Makefile
shlwapi.dll
shlwapi.dll.dbg.c
shlwapi.res
shlwapi.spec.c
shlwapi.spec.def
......@@ -12,6 +12,7 @@ C_SRCS = \
assoc.c \
clist.c \
istream.c \
msgbox.c \
ordinal.c \
path.c \
reg.c \
......@@ -23,6 +24,9 @@ C_SRCS = \
url.c \
wsprintf.c
RC_SRCS = \
shlwapi.rc
SUBDIRS = tests
@MAKE_DLL_RULES@
......
/*
* SHLWAPI message box functions
*
* Copyright 2004 Jon Griffiths
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define COM_NO_WINDOWS_H
#include "config.h"
#include "wine/port.h"
#include <stdarg.h>
#include <string.h>
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winreg.h"
#include "shlwapi.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
extern HINSTANCE shlwapi_hInstance; /* in shlwapi_main.c */
static const WCHAR szDontShowKey[] = { 'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
'E','x','p','l','o','r','e','r','\\','D','o','n','t','S','h','o','w',
'M','e','T','h','i','s','D','i','a','l','o','g','A','g','a','i','n','\0'
};
INT_PTR WINAPI SHMessageBoxCheckExW(HWND,HINSTANCE,LPCWSTR,DLGPROC,LPARAM,INT_PTR,LPCWSTR);
INT_PTR WINAPI SHMessageBoxCheckW(HWND,LPCWSTR,LPCWSTR,DWORD,INT_PTR,LPCWSTR);
/* Data held by each general message boxes */
typedef struct tagDLGDATAEX
{
DLGPROC dlgProc; /* User supplied DlgProc */
LPARAM lParam; /* User supplied LPARAM for dlgProc */
LPCWSTR lpszId; /* Name of reg key holding whether to skip */
} DLGDATAEX;
/* Dialogue procedure for general message boxes */
static INT_PTR CALLBACK SHDlgProcEx(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DLGDATAEX *d = (DLGDATAEX *)GetWindowLongW(hDlg, DWL_USER);
TRACE("(%p,%u,%d,%ld) data %p\n", hDlg, uMsg, wParam, lParam, d);
switch (uMsg)
{
case WM_INITDIALOG:
{
/* FIXME: Not sure where native stores its lParam */
SetWindowLongW(hDlg, DWL_USER, lParam);
d = (DLGDATAEX *)lParam;
TRACE("WM_INITDIALOG: %p, %s,%p,%p\n", hDlg, debugstr_w(d->lpszId),
d->dlgProc, (void*)d->lParam);
if (d->dlgProc)
return d->dlgProc(hDlg, uMsg, wParam, d->lParam);
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDYES:
LOWORD(wParam) = IDOK;
/* Fall through ... */
case IDNO:
if (LOWORD(wParam) == IDNO)
LOWORD(wParam) = IDCANCEL;
/* Fall through ... */
case IDOK:
case IDCANCEL:
TRACE("WM_COMMAND: id=%s data=%p\n",
LOWORD(wParam) == IDOK ? "IDOK" : "IDCANCEL", d);
if (SendMessageW(GetDlgItem(hDlg, IDC_ERR_DONT_SHOW), BM_GETCHECK, 0L, 0L))
{
DWORD dwZero = 0;
/* The user clicked 'don't show again', so set the key */
SHRegSetUSValueW(szDontShowKey, d->lpszId, REG_DWORD, &dwZero,
sizeof(dwZero), SHREGSET_DEFAULT);
}
if (!d->dlgProc || !d->dlgProc(hDlg, uMsg, wParam, lParam))
EndDialog(hDlg, wParam);
return TRUE;
}
break;
default:
break;
}
if (d && d->dlgProc)
return d->dlgProc(hDlg, uMsg, wParam, lParam);
return FALSE;
}
/*************************************************************************
* @ [SHLWAPI.291]
*
* Pop up a 'Don't show this message again' dialogue box.
*
* PARAMS
* hWnd [I] Window to be the dialogues' parent
* hInst [I] Instance of the module holding the dialogue resource
* lpszName [I] Resource Id of the dialogue resource
* dlgProc [I] Dialog procedure, or NULL for default handling
* lParam [I] LPARAM to pass to dlgProc
* iRet [I] Value to return if dialogue is not shown
* lpszId [I] Name of registry subkey which determines whether to show the dialog
*
* RETURNS
* Success: The value returned from the dialogue procedure.
* Failure: iRet, if the dialogue resource could not be loaded or the dialogue
* should not be shown.
*
* NOTES
* Both lpszName and lpszId must be less than MAX_PATH in length.
*/
INT_PTR WINAPI SHMessageBoxCheckExA(HWND hWnd, HINSTANCE hInst, LPCSTR lpszName,
DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet,
LPCSTR lpszId)
{
WCHAR szNameBuff[MAX_PATH], szIdBuff[MAX_PATH];
LPCWSTR szName = szNameBuff;
if (HIWORD(lpszName))
MultiByteToWideChar(CP_ACP, 0, lpszName, -1, szNameBuff, MAX_PATH);
else
szName = (LPCWSTR)lpszName; /* Resource Id or NULL */
MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH);
return SHMessageBoxCheckExW(hWnd, hInst, szName, dlgProc, lParam, iRet, szIdBuff);
}
/*************************************************************************
* @ [SHLWAPI.292]
*
* Unicode version of SHMessageBoxCheckExW.
*/
INT_PTR WINAPI SHMessageBoxCheckExW(HWND hWnd, HINSTANCE hInst, LPCWSTR lpszName,
DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet, LPCWSTR lpszId)
{
DLGDATAEX d;
if (!SHRegGetBoolUSValueW(szDontShowKey, lpszId, FALSE, TRUE))
return iRet;
d.dlgProc = dlgProc;
d.lParam = lParam;
d.lpszId = lpszId;
return DialogBoxParamW(hInst, (LPCWSTR)lpszName, hWnd, SHDlgProcEx, (LPARAM)&d);
}
/* Data held by each shlwapi message box */
typedef struct tagDLGDATA
{
LPCWSTR lpszTitle; /* User supplied message title */
LPCWSTR lpszText; /* User supplied message text */
DWORD dwType; /* Message box type */
} DLGDATA;
/* Dialogue procedure for shlwapi message boxes */
static INT_PTR CALLBACK SHDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TRACE("(%p,%u,%d,%ld)\n", hDlg, uMsg, wParam, lParam);
switch (uMsg)
{
case WM_INITDIALOG:
{
DLGDATA *d = (DLGDATA *)lParam;
TRACE("WM_INITDIALOG: %p, %s,%s,%ld\n", hDlg, debugstr_w(d->lpszTitle),
debugstr_w(d->lpszText), d->dwType);
SetWindowTextW(hDlg, d->lpszTitle);
SetWindowTextW(GetDlgItem(hDlg, IDS_ERR_USER_MSG), d->lpszText);
/* Set buttons according to dwType */
switch (d->dwType)
{
case 0:
ShowWindow(GetDlgItem(hDlg, IDCANCEL), FALSE);
/* FIXME: Move OK button to position of the Cancel button (cosmetic) */
case 1:
ShowWindow(GetDlgItem(hDlg, IDYES), FALSE);
ShowWindow(GetDlgItem(hDlg, IDNO), FALSE);
break;
default:
ShowWindow(GetDlgItem(hDlg, IDOK), FALSE);
ShowWindow(GetDlgItem(hDlg, IDCANCEL), FALSE);
break;
}
return TRUE;
}
default:
break;
}
return FALSE;
}
/*************************************************************************
* @ [SHLWAPI.185]
*
* Pop up a 'Don't show this message again' dialogue box.
*
* PARAMS
* hWnd [I] Window to be the dialogues' parent
* lpszText [I] Text of the message to show
* lpszTitle [I] Title of the dialogue box
* dwType [I] Type of dialogue buttons (See below)
* iRet [I] Value to return if dialogue is not shown
* lpszId [I] Name of registry subkey which determines whether to show the dialog
*
* RETURNS
* Success: The value returned from the dialogue procedure (e.g. IDOK).
* Failure: iRet, if the default dialogue resource could not be loaded or the
* dialogue should not be shown.
*
* NOTES
* - Both lpszTitle and lpszId must be less than MAX_PATH in length.
* - Possible values for dwType are:
*| Value Buttons
*| ----- -------
*| 0 OK
*| 1 OK/Cancel
*| 2 Yes/No
*/
INT_PTR WINAPI SHMessageBoxCheckA(HWND hWnd, LPCSTR lpszText, LPCSTR lpszTitle,
DWORD dwType, INT_PTR iRet, LPCSTR lpszId)
{
WCHAR szTitleBuff[MAX_PATH], szIdBuff[MAX_PATH];
WCHAR *szTextBuff = NULL;
int iLen;
INT_PTR iRetVal;
if (lpszTitle)
MultiByteToWideChar(CP_ACP, 0, lpszTitle, -1, szTitleBuff, MAX_PATH);
if (lpszText)
{
iLen = MultiByteToWideChar(CP_ACP, 0, lpszText, -1, NULL, 0);
szTextBuff = HeapAlloc(GetProcessHeap(), 0, iLen * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpszText, -1, szTextBuff, iLen);
}
MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH);
iRetVal = SHMessageBoxCheckW(hWnd, szTextBuff, lpszTitle ? szTitleBuff : NULL,
dwType, iRet, szIdBuff);
if (szTextBuff)
HeapFree(GetProcessHeap(), 0, szTextBuff);
return iRetVal;
}
/*************************************************************************
* @ [SHLWAPI.191]
*
* Unicode version of SHMessageBoxCheckA.
*/
INT_PTR WINAPI SHMessageBoxCheckW(HWND hWnd, LPCWSTR lpszText, LPCWSTR lpszTitle,
DWORD dwType, INT_PTR iRet, LPCWSTR lpszId)
{
DLGDATA d;
d.lpszTitle = lpszTitle;
d.lpszText = lpszText;
d.dwType = dwType;
return SHMessageBoxCheckExW(hWnd, shlwapi_hInstance, (LPCWSTR)IDD_ERR_DIALOG,
SHDlgProc, (LPARAM)&d, iRet, lpszId);
}
......@@ -45,7 +45,6 @@
#include "wine/unicode.h"
#include "servprov.h"
#include "winreg.h"
#include "winuser.h"
#include "wine/debug.h"
#include "shlwapi.h"
......@@ -1902,41 +1901,6 @@ DWORD WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, IDispatch** lppDisp)
return hRet;
}
static const WCHAR szDontShowKey[] = { 'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
'E','x','p','l','o','r','e','r','\\','D','o','n','t','S','h','o','w',
'M','e','T','h','i','s','D','i','a','l','o','g','A','g','a','i','n','\0'
};
/*************************************************************************
* @ [SHLWAPI.191]
*
* Pop up a 'Don't show this message again' error dialog box.
*
* PARAMS
* hWnd [I] Window to own the dialog box
* arg2 [I] Unknown
* arg3 [I] Unknown
* arg4 [I] Unknown
* arg5 [I] Unknown
* lpszValue [I] Registry value holding boolean show/don't show.
*
* RETURNS
* Nothing.
*/
void WINAPI SHMessageBoxCheckW(HWND hWnd, PVOID arg2, PVOID arg3, PVOID arg4, PVOID arg5, LPCWSTR lpszValue)
{
FIXME("(%p,%p,%p,%p,%p,%s) - stub!\n", hWnd, arg2, arg3, arg4, arg5, debugstr_w(lpszValue));
if (SHRegGetBoolUSValueW(szDontShowKey, lpszValue, FALSE, TRUE))
{
/* FIXME: Should use DialogBoxParamW to load a dialog box; its dlgproc
* should accept clicks on 'Don't show' and set the reg value appropriately.
*/
}
}
/*************************************************************************
* @ [SHLWAPI.192]
*
......@@ -1989,6 +1953,40 @@ DWORD WINAPI SHGetCurColorRes()
}
/*************************************************************************
* @ [SHLWAPI.194]
*
* Wait for a message to arrive, with a timeout.
*
* PARAMS
* hand [I] Handle to query
* dwTimeout [I] Timeout in ticks or INFINITE to never timeout
*
* RETURNS
* STATUS_TIMEOUT if no message is recieved before dwTimeout ticks passes.
* Otherwise returns value from MsgWaitForMultipleObjectsEx when a message is available.
*/
DWORD WINAPI SHWaitForSendMessageThread(HANDLE hand, DWORD dwTimeout)
{
DWORD dwEndTicks = GetTickCount() + dwTimeout;
DWORD dwRet;
while ((dwRet = MsgWaitForMultipleObjectsEx(1, &hand, dwTimeout, QS_SENDMESSAGE, 0)) == 1)
{
MSG msg;
PeekMessageW(&msg, NULL, 0, 0, PM_NOREMOVE);
if (dwTimeout != INFINITE)
{
if ((int)(dwTimeout = dwEndTicks - GetTickCount()) <= 0)
return WAIT_TIMEOUT;
}
}
return dwRet;
}
/*************************************************************************
* @ [SHLWAPI.197]
*
* Blank out a region of text by drawing the background only.
......@@ -2010,6 +2008,43 @@ DWORD WINAPI SHFillRectClr(HDC hDC, LPCRECT pRect, COLORREF cRef)
}
/*************************************************************************
* @ [SHLWAPI.198]
*
* Return the value asociated with a key in a map.
*
* PARAMS
* lpKeys [I] A list of keys of length iLen
* lpValues [I] A list of values associated with lpKeys, of length iLen
* iLen [I] Length of both lpKeys and lpValues
* iKey [I] The key value to look up in lpKeys
*
* RETURNS
* The value in lpValues associated with iKey, or -1 if iKey is not
* found in lpKeys.
*
* NOTES
* - If two elements in the map share the same key, this function returns
* the value closest to the start of the map
* - The native version of this function crashes if lpKeys or lpValues is NULL.
*/
int WINAPI SHSearchMapInt(const int *lpKeys, const int *lpValues, int iLen, int iKey)
{
if (lpKeys && lpValues)
{
int i = 0;
while (i < iLen)
{
if (lpKeys[i] == iKey)
return lpValues[i]; /* Found */
i++;
}
}
return -1; /* Not found */
}
/*************************************************************************
* @ [SHLWAPI.199]
*
* Copy an interface pointer
......@@ -2421,7 +2456,7 @@ static WCHAR strRegistryPolicyW[] = {'S','o','f','t','w','a','r','e','\\','M','i
*/
DWORD WINAPI SHGetRestriction(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpValue)
{
DWORD retval, datsize = 4;
DWORD retval, datsize = sizeof(retval);
HKEY hKey;
if (!lpSubKey)
......
/*
* Resource defines for shlwapi
*
* Copyright 2004 Jon Griffiths
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef WINE_SHLWAPI_RESOURCE_H
#define WINE_SHLWAPI_RESOURCE_H
/* These numbers match native ID's and shouldn't be abitrarily changed */
#define IDD_ERR_DIALOG 0x1200
#define IDS_ERR_USER_MSG 0x1201
#define IDC_ERR_DONT_SHOW 0x1202
#define IDS_ERR_USER_MSG2 0x1203
#endif /* WINE_SHLWAPI_RESOURCE_H */
/*
* Top level resource file for shlwapi
*
* Copyright 2004 Jon Griffiths
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "resource.h"
#include "shlwapi_En.rc"
......@@ -182,20 +182,20 @@
182 stdcall -noname SHCheckMenuItem(long long long)
183 stdcall -noname SHRegisterClassA(ptr)
184 stdcall @(ptr ptr long) SHLWAPI_184
185 stub -noname SHMessageBoxCheckA
185 stdcall -noname SHMessageBoxCheckA(ptr str str long long str)
186 stub -noname SHSimulateDrop
187 stdcall -noname SHLoadFromPropertyBag(ptr ptr)
188 stub -noname IUnknown_TranslateAcceleratorOCS
189 stdcall -noname IUnknown_OnFocusOCS(ptr ptr)
190 stub -noname IUnknown_HandleIRestrict
191 stub -noname SHMessageBoxCheckW
191 stdcall -noname SHMessageBoxCheckW(ptr wstr wstr long long wstr)
192 stdcall -noname SHGetMenuFromID(ptr long)
193 stdcall -noname SHGetCurColorRes()
194 stub -noname SHWaitForSendMessageThread
194 stdcall -noname SHWaitForSendMessageThread(ptr long)
195 stub -noname SHIsExpandableFolder
196 stub -noname DnsRecordSetCompare
197 stdcall -noname SHFillRectClr(long ptr long)
198 stub -noname SHSearchMapInt
198 stdcall -noname SHSearchMapInt(ptr ptr long long)
199 stdcall -noname IUnknown_Set(ptr ptr)
200 stub -noname MayQSForward
201 stdcall -noname MayExecForward(ptr long ptr long long ptr ptr)
......@@ -213,7 +213,7 @@
213 stdcall -noname IStream_Reset(ptr)
214 stdcall -noname IStream_Size(ptr ptr)
215 stdcall -noname SHAnsiToUnicode(str ptr long)
216 stub -noname SHAnsiToUnicodeCP
216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long)
217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr)
218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr ptr)
219 stdcall -noname QISearch(long long long long)
......@@ -222,7 +222,7 @@
222 stdcall -noname _SHGlobalCounterCreate(long)
223 stdcall -noname _SHGlobalCounterGetValue(long)
224 stdcall -noname _SHGlobalCounterIncrement(long)
225 stub -noname SHStripMneumonicW
225 stdcall -noname SHStripMneumonicW(wstr)
226 stub -noname ZoneCheckPathA
227 stub -noname ZoneCheckPathW
228 stub -noname ZoneCheckUrlA
......@@ -288,8 +288,8 @@
288 stub -noname IUnknown_CPContainerInvokeIndirect
289 stdcall -noname PlaySoundWrapW(wstr long long)
290 stub -noname SHMirrorIcon
291 stub -noname SHMessageBoxCheckExA
292 stub -noname SHMessageBoxCheckExW
291 stdcall -noname SHMessageBoxCheckExA(ptr ptr ptr ptr ptr long str)
292 stdcall -noname SHMessageBoxCheckExW(ptr ptr ptr ptr ptr long wstr)
293 stub -noname SHCancelUserWorkItems
294 stdcall -noname SHGetIniStringW(long long long long long)
295 stdcall -noname SHSetIniStringW(wstr ptr wstr wstr)
......
/*
* English resources for shlwapi
*
* Copyright 2004 Jon Griffiths
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Error!"
FONT 8, "MS Shell Dlg"
{
LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20
LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8
CHECKBOX "Don't show me th&is message again", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&OK" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Cancel" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Yes" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&No" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
}
......@@ -2435,11 +2435,46 @@ char WINAPI SHStripMneumonicA(LPCSTR lpszStr)
}
/*************************************************************************
* @ [SHLWAPI.215]
* @ [SHLWAPI.225]
*
* Unicode version of SHStripMneumonicA.
*/
WCHAR WINAPI SHStripMneumonicW(LPCWSTR lpszStr)
{
LPWSTR lpszIter, lpszTmp;
WCHAR ch;
TRACE("(%s)\n", debugstr_w(lpszStr));
ch = *lpszStr;
if ((lpszIter = StrChrW(lpszStr, '&')))
{
lpszTmp = CharNextW(lpszIter);
if (lpszTmp && *lpszTmp)
{
if (*lpszTmp != '&')
ch = *lpszTmp;
while (lpszIter && *lpszIter)
{
lpszTmp = CharNextW(lpszIter);
*lpszIter = *lpszTmp;
lpszIter = lpszTmp;
}
}
}
return ch;
}
/*************************************************************************
* @ [SHLWAPI.216]
*
* Convert an Ascii string to Unicode.
*
* PARAMS
* dwCp [I] Code page for the conversion
* lpSrcStr [I] Source Ascii string to convert
* lpDstStr [O] Destination for converted Unicode string
* iLen [I] Length of lpDstStr
......@@ -2447,16 +2482,37 @@ char WINAPI SHStripMneumonicA(LPCSTR lpszStr)
* RETURNS
* The return value of the MultiByteToWideChar() function called on lpSrcStr.
*/
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
DWORD WINAPI SHAnsiToUnicodeCP(DWORD dwCp, LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
{
DWORD dwRet;
dwRet = MultiByteToWideChar(CP_ACP, 0, lpSrcStr, -1, lpDstStr, iLen);
dwRet = MultiByteToWideChar(dwCp, 0, lpSrcStr, -1, lpDstStr, iLen);
TRACE("%s->%s,ret=%ld\n", debugstr_a(lpSrcStr), debugstr_w(lpDstStr), dwRet);
return dwRet;
}
/*************************************************************************
* @ [SHLWAPI.215]
*
* Convert an Ascii string to Unicode.
*
* PARAMS
* lpSrcStr [I] Source Ascii string to convert
* lpDstStr [O] Destination for converted Unicode string
* iLen [I] Length of lpDstStr
*
* RETURNS
* The return value of the MultiByteToWideChar() function called on lpSrcStr.
*
* NOTES
* This function simply calls SHAnsiToUnicodeCP with code page CP_ACP.
*/
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
{
return SHAnsiToUnicodeCP(CP_ACP, lpSrcStr, lpDstStr, iLen);
}
/*************************************************************************
* @ [SHLWAPI.218]
*
* Convert a Unicode string to Ascii.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment