SHELL_ExecuteW() passes a Unicode environment to CreateProcessW() so
it must specify the CREATE_UNICODE_ENVIRONMENT flag. Also the SHELL_ExecuteW32() functions will always be called with a Unicode environment so adjust their prototype accordingly.
This commit is contained in:
parent
4ad5ccfb58
commit
1117e69c14
|
@ -611,7 +611,7 @@ DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len )
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* SHELL_Execute16 [Internal]
|
* SHELL_Execute16 [Internal]
|
||||||
*/
|
*/
|
||||||
static UINT SHELL_Execute16(const WCHAR *lpCmd, void *env, BOOL shWait,
|
static UINT SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
|
||||||
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
||||||
{
|
{
|
||||||
UINT ret;
|
UINT ret;
|
||||||
|
|
|
@ -228,13 +228,13 @@ inline static WCHAR * __SHCloneStrAtoW(WCHAR ** target, const char * source)
|
||||||
#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16))
|
#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16))
|
||||||
#define HINSTANCE_16(h32) (LOWORD(h32))
|
#define HINSTANCE_16(h32) (LOWORD(h32))
|
||||||
|
|
||||||
typedef UINT (*SHELL_ExecuteW32)(const WCHAR *lpCmd, void *env, BOOL shWait,
|
typedef UINT (*SHELL_ExecuteW32)(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
|
||||||
LPSHELLEXECUTEINFOW sei, LPSHELLEXECUTEINFOW sei_out);
|
LPSHELLEXECUTEINFOW sei, LPSHELLEXECUTEINFOW sei_out);
|
||||||
|
|
||||||
BOOL WINAPI ShellExecuteExW32(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc);
|
BOOL WINAPI ShellExecuteExW32(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc);
|
||||||
|
|
||||||
UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation,
|
UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation,
|
||||||
LPWSTR lpResult, int resultLen, LPWSTR key, void **env, LPITEMIDLIST pidl, LPCWSTR args);
|
LPWSTR lpResult, int resultLen, LPWSTR key, WCHAR **env, LPITEMIDLIST pidl, LPCWSTR args);
|
||||||
|
|
||||||
extern WCHAR swShell32Name[MAX_PATH];
|
extern WCHAR swShell32Name[MAX_PATH];
|
||||||
|
|
||||||
|
|
|
@ -298,7 +298,7 @@ static HRESULT SHELL_ResolveShortCutW(LPWSTR wcmd, LPWSTR wargs, LPWSTR wdir, HW
|
||||||
* SHELL_ExecuteW [Internal]
|
* SHELL_ExecuteW [Internal]
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static UINT SHELL_ExecuteW(const WCHAR *lpCmd, void *env, BOOL shWait,
|
static UINT SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
|
||||||
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
||||||
{
|
{
|
||||||
STARTUPINFOW startup;
|
STARTUPINFOW startup;
|
||||||
|
@ -318,7 +318,7 @@ static UINT SHELL_ExecuteW(const WCHAR *lpCmd, void *env, BOOL shWait,
|
||||||
startup.cb = sizeof(STARTUPINFOW);
|
startup.cb = sizeof(STARTUPINFOW);
|
||||||
startup.dwFlags = STARTF_USESHOWWINDOW;
|
startup.dwFlags = STARTF_USESHOWWINDOW;
|
||||||
startup.wShowWindow = psei->nShow;
|
startup.wShowWindow = psei->nShow;
|
||||||
if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, 0,
|
if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT,
|
||||||
env, *psei->lpDirectory? psei->lpDirectory: NULL, &startup, &info))
|
env, *psei->lpDirectory? psei->lpDirectory: NULL, &startup, &info))
|
||||||
{
|
{
|
||||||
/* Give 30 seconds to the app to come up, if desired. Probably only needed
|
/* Give 30 seconds to the app to come up, if desired. Probably only needed
|
||||||
|
@ -416,7 +416,7 @@ static void *SHELL_BuildEnvW( const WCHAR *path )
|
||||||
* On entry: szName is a filename (probably without path separators).
|
* On entry: szName is a filename (probably without path separators).
|
||||||
* On exit: if szName found in "App Path", place full path in lpResult, and return true
|
* On exit: if szName found in "App Path", place full path in lpResult, and return true
|
||||||
*/
|
*/
|
||||||
static BOOL SHELL_TryAppPathW( LPCWSTR szName, LPWSTR lpResult, void**env)
|
static BOOL SHELL_TryAppPathW( LPCWSTR szName, LPWSTR lpResult, WCHAR **env)
|
||||||
{
|
{
|
||||||
static const WCHAR wszKeyAppPaths[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s',
|
static const WCHAR wszKeyAppPaths[] = {'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','\\','A','p','p',' ','P','a','t','h','s','\\',0};
|
'\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','A','p','p',' ','P','a','t','h','s','\\',0};
|
||||||
|
@ -513,7 +513,7 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW
|
||||||
* on the operation)
|
* on the operation)
|
||||||
*/
|
*/
|
||||||
UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation,
|
UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation,
|
||||||
LPWSTR lpResult, int resultLen, LPWSTR key, void **env, LPITEMIDLIST pidl, LPCWSTR args)
|
LPWSTR lpResult, int resultLen, LPWSTR key, WCHAR **env, LPITEMIDLIST pidl, LPCWSTR args)
|
||||||
{
|
{
|
||||||
static const WCHAR wWindows[] = {'w','i','n','d','o','w','s',0};
|
static const WCHAR wWindows[] = {'w','i','n','d','o','w','s',0};
|
||||||
static const WCHAR wPrograms[] = {'p','r','o','g','r','a','m','s',0};
|
static const WCHAR wPrograms[] = {'p','r','o','g','r','a','m','s',0};
|
||||||
|
@ -734,7 +734,7 @@ static HDDEDATA CALLBACK dde_cb(UINT uType, UINT uFmt, HCONV hConv,
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec,
|
static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec,
|
||||||
const WCHAR* lpFile, void *env,
|
const WCHAR* lpFile, WCHAR *env,
|
||||||
LPCWSTR szCommandline, LPITEMIDLIST pidl, SHELL_ExecuteW32 execfunc,
|
LPCWSTR szCommandline, LPITEMIDLIST pidl, SHELL_ExecuteW32 execfunc,
|
||||||
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
||||||
{
|
{
|
||||||
|
@ -828,7 +828,7 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec,
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* execute_from_key [Internal]
|
* execute_from_key [Internal]
|
||||||
*/
|
*/
|
||||||
static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, void *env, LPCWSTR szCommandline,
|
static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, WCHAR *env, LPCWSTR szCommandline,
|
||||||
SHELL_ExecuteW32 execfunc,
|
SHELL_ExecuteW32 execfunc,
|
||||||
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
|
||||||
{
|
{
|
||||||
|
@ -945,7 +945,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfun
|
||||||
WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wszDir[MAX_PATH];
|
WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wszDir[MAX_PATH];
|
||||||
SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */
|
SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */
|
||||||
WCHAR wfileName[MAX_PATH];
|
WCHAR wfileName[MAX_PATH];
|
||||||
void *env;
|
WCHAR *env;
|
||||||
WCHAR lpstrProtocol[256];
|
WCHAR lpstrProtocol[256];
|
||||||
LPCWSTR lpFile;
|
LPCWSTR lpFile;
|
||||||
UINT retval = 31;
|
UINT retval = 31;
|
||||||
|
|
Loading…
Reference in New Issue