Sync to Wine-0_9:

Lionel Ulmer <lionel.ulmer@free.fr>
- fix first two arguments to 'FindExecutableA' (input strings instead
  of pointers)
- fix last argument to 'FindExecutableW' (it's an output string)
Francois Gouget <fgouget@free.fr>
- Use "static const" rather than "const static" as gcc -W complains
  about the former.
Jonathan Ernst <Jonathan@ErnstFamily.ch>
- First creation of registry entries missed AppData.
Aric Stewart <aric@codeweavers.com>
- MSDN states that the pszDisplayName member of BROWSEINFO is assumed to
  be MAX_PATH in length. So when doing the A->W conversion in
  BrowseForFolderA do not set that member to be the size of the
  incoming string, instead make it MAX_PATH.
Dmitry Timoshkov <dmitry@codeweavers.com>
- Use appropriate DDE APIs (ANSI or unicode) for ShellExecuteA/W, Excel
  2000 depends on that.
Martin Fuchs <martin-fuchs@gmx.net>
- Simplify 'sei' structure initialization in ShellExecuteA/W.
Mike McCormack <mike@codeweavers.com>
- Use ShellLink_QueryInterface to return the right interface in
  IShellLink_Constructor.
Richard Cohen <richard@daijobu.co.uk>
- Don't hardcode "windows" directory.

svn path=/trunk/; revision=18956
This commit is contained in:
Gé van Geldorp 2005-11-02 20:50:50 +00:00
parent 174476f772
commit 91c3198544
9 changed files with 51 additions and 38 deletions

View file

@ -627,9 +627,8 @@ LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOA lpbi)
bi.pidlRoot = lpbi->pidlRoot; bi.pidlRoot = lpbi->pidlRoot;
if (lpbi->pszDisplayName) if (lpbi->pszDisplayName)
{ {
len = MultiByteToWideChar( CP_ACP, 0, lpbi->pszDisplayName, -1, NULL, 0 ); bi.pszDisplayName = HeapAlloc( GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR) );
bi.pszDisplayName = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); MultiByteToWideChar( CP_ACP, 0, lpbi->pszDisplayName, -1, bi.pszDisplayName, MAX_PATH );
MultiByteToWideChar( CP_ACP, 0, lpbi->pszDisplayName, -1, bi.pszDisplayName, len );
} }
else else
bi.pszDisplayName = NULL; bi.pszDisplayName = NULL;

View file

@ -112,9 +112,9 @@ BOOL CreateFolderEnumList(
HANDLE hFile; HANDLE hFile;
WCHAR szPath[MAX_PATH]; WCHAR szPath[MAX_PATH];
BOOL succeeded = TRUE; BOOL succeeded = TRUE;
const static WCHAR stars[] = { '*','.','*',0 }; static const WCHAR stars[] = { '*','.','*',0 };
const static WCHAR dot[] = { '.',0 }; static const WCHAR dot[] = { '.',0 };
const static WCHAR dotdot[] = { '.','.',0 }; static const WCHAR dotdot[] = { '.','.',0 };
TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_w(lpszPath),dwFlags); TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_w(lpszPath),dwFlags);

View file

@ -625,7 +625,7 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation,
seiW.dwHotKey = 0; seiW.dwHotKey = 0;
seiW.hProcess = hProcess; seiW.hProcess = hProcess;
ShellExecuteExW32 (&seiW, SHELL_Execute16); SHELL_execute( &seiW, SHELL_Execute16, FALSE );
if (wVerb) SHFree(wVerb); if (wVerb) SHFree(wVerb);
if (wFile) SHFree(wFile); if (wFile) SHFree(wFile);

View file

@ -290,8 +290,8 @@
@ stdcall ExtractIconW(long wstr long) @ stdcall ExtractIconW(long wstr long)
@ stub ExtractVersionResource16W @ stub ExtractVersionResource16W
@ stub FindExeDlgProc @ stub FindExeDlgProc
@ stdcall FindExecutableA(ptr ptr ptr) @ stdcall FindExecutableA(str str ptr)
@ stdcall FindExecutableW(wstr wstr wstr) @ stdcall FindExecutableW(wstr wstr ptr)
@ stub FixupOptionalComponents @ stub FixupOptionalComponents
@ stdcall FreeIconList(long) @ stdcall FreeIconList(long)
@ stub InternalExtractIconListA @ stub InternalExtractIconListA

View file

@ -213,7 +213,7 @@ inline static WCHAR * __SHCloneStrAtoW(WCHAR ** target, const char * source)
typedef UINT_PTR (*SHELL_ExecuteW32)(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, typedef UINT_PTR (*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 SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc, BOOL unicode);
UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation,
LPWSTR lpResult, int resultLen, LPWSTR key, WCHAR **env, LPITEMIDLIST pidl, LPCWSTR args); LPWSTR lpResult, int resultLen, LPWSTR key, WCHAR **env, LPITEMIDLIST pidl, LPCWSTR args);

View file

@ -1152,6 +1152,7 @@ HRESULT WINAPI IShellLink_Constructor( IUnknown *pUnkOuter,
REFIID riid, LPVOID *ppv ) REFIID riid, LPVOID *ppv )
{ {
IShellLinkImpl * sl; IShellLinkImpl * sl;
HRESULT r;
TRACE("unkOut=%p riid=%s\n",pUnkOuter, debugstr_guid(riid)); TRACE("unkOut=%p riid=%s\n",pUnkOuter, debugstr_guid(riid));
@ -1176,18 +1177,9 @@ HRESULT WINAPI IShellLink_Constructor( IUnknown *pUnkOuter,
TRACE("(%p)->()\n",sl); TRACE("(%p)->()\n",sl);
if (IsEqualIID(riid, &IID_IUnknown) || r = ShellLink_QueryInterface( sl, riid, ppv );
IsEqualIID(riid, &IID_IShellLinkA)) ShellLink_Release( sl );
*ppv = sl; return r;
else if (IsEqualIID(riid, &IID_IShellLinkW))
*ppv = &(sl->lpvtblw);
else {
LocalFree((HLOCAL)sl);
ERR("E_NOINTERFACE\n");
return E_NOINTERFACE;
}
return S_OK;
} }

View file

@ -805,7 +805,7 @@ static const WCHAR szSHUserFolders[] = {'S','o','f','t','w','a','r','e','\\','M'
/* This defaults to L"Documents and Settings" on Windows 2000/XP, but we're /* This defaults to L"Documents and Settings" on Windows 2000/XP, but we're
* acting more Windows 9x-like for now. * acting more Windows 9x-like for now.
*/ */
static const WCHAR szDefaultProfileDirW[] = {'w','i','n','d','o','w','s','\\','p','r','o','f','i','l','e','s','\0'}; static const WCHAR szDefaultProfileDirW[] = {'p','r','o','f','i','l','e','s','\0'};
static const WCHAR AllUsersW[] = {'A','l','l',' ','U','s','e','r','s','\0'}; static const WCHAR AllUsersW[] = {'A','l','l',' ','U','s','e','r','s','\0'};
typedef enum _CSIDL_Type { typedef enum _CSIDL_Type {
@ -1259,6 +1259,9 @@ static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath)
switch (folder) switch (folder)
{ {
case CSIDL_PERSONAL: case CSIDL_PERSONAL:
case CSIDL_MYMUSIC:
case CSIDL_MYPICTURES:
case CSIDL_MYVIDEO:
{ {
const char *home = getenv("HOME"); const char *home = getenv("HOME");
@ -1792,6 +1795,7 @@ static HRESULT _SHRegisterUserShellFolders(BOOL bDefault)
CSIDL_PROGRAMS, CSIDL_PROGRAMS,
CSIDL_PERSONAL, CSIDL_PERSONAL,
CSIDL_FAVORITES, CSIDL_FAVORITES,
CSIDL_APPDATA,
CSIDL_STARTUP, CSIDL_STARTUP,
CSIDL_RECENT, CSIDL_RECENT,
CSIDL_SENDTO, CSIDL_SENDTO,

View file

@ -427,7 +427,7 @@ static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf (IShellFolder2 * iface,
{ {
IGenericSFImpl *This = (IGenericSFImpl *)iface; IGenericSFImpl *This = (IGenericSFImpl *)iface;
HRESULT hr = S_OK; HRESULT hr = S_OK;
const static DWORD dwDesktopAttributes = static const DWORD dwDesktopAttributes =
SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR |
SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER;

View file

@ -772,7 +772,8 @@ 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, WCHAR *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,
BOOL unicode)
{ {
static const WCHAR wApplication[] = {'\\','a','p','p','l','i','c','a','t','i','o','n',0}; static const WCHAR wApplication[] = {'\\','a','p','p','l','i','c','a','t','i','o','n',0};
static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0}; static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0};
@ -803,9 +804,15 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec,
strcpyW(topic, wSystem); strcpyW(topic, wSystem);
} }
if (DdeInitializeW(&ddeInst, dde_cb, APPCMD_CLIENTONLY, 0L) != DMLERR_NO_ERROR) if (unicode)
{ {
return 2; if (DdeInitializeW(&ddeInst, dde_cb, APPCMD_CLIENTONLY, 0L) != DMLERR_NO_ERROR)
return 2;
}
else
{
if (DdeInitializeA(&ddeInst, dde_cb, APPCMD_CLIENTONLY, 0L) != DMLERR_NO_ERROR)
return 2;
} }
hszApp = DdeCreateStringHandleW(ddeInst, app, CP_WINUNICODE); hszApp = DdeCreateStringHandleW(ddeInst, app, CP_WINUNICODE);
@ -845,8 +852,18 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec,
/* It's documented in the KB 330337 that IE has a bug and returns /* It's documented in the KB 330337 that IE has a bug and returns
* error DMLERR_NOTPROCESSED on XTYP_EXECUTE request. * error DMLERR_NOTPROCESSED on XTYP_EXECUTE request.
*/ */
hDdeData = DdeClientTransaction((LPBYTE)res, (strlenW(res) + 1) * sizeof(WCHAR), hConv, 0L, 0, if (unicode)
XTYP_EXECUTE, 10000, &tid); hDdeData = DdeClientTransaction((LPBYTE)res, (strlenW(res) + 1) * sizeof(WCHAR), hConv, 0L, 0,
XTYP_EXECUTE, 10000, &tid);
else
{
DWORD lenA = WideCharToMultiByte(CP_ACP, 0, res, -1, NULL, 0, NULL, NULL);
char *resA = HeapAlloc(GetProcessHeap(), 0, lenA);
WideCharToMultiByte(CP_ACP, 0, res, -1, resA, lenA, NULL, NULL);
hDdeData = DdeClientTransaction( (LPBYTE)resA, lenA, hConv, 0L, 0,
XTYP_EXECUTE, 10000, &tid );
HeapFree(GetProcessHeap(), 0, resA);
}
if (hDdeData) if (hDdeData)
DdeFreeDataHandle(hDdeData); DdeFreeDataHandle(hDdeData);
else else
@ -866,7 +883,8 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec,
*/ */
static UINT_PTR execute_from_key(LPWSTR key, LPCWSTR lpFile, WCHAR *env, LPCWSTR szCommandline, static UINT_PTR 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,
BOOL unicode)
{ {
WCHAR cmd[1024]; WCHAR cmd[1024];
LONG cmdlen = sizeof(cmd); LONG cmdlen = sizeof(cmd);
@ -894,7 +912,7 @@ static UINT_PTR execute_from_key(LPWSTR key, LPCWSTR lpFile, WCHAR *env, LPCWSTR
if (RegQueryValueW(HKEY_CLASSES_ROOT, key, param, &paramlen) == ERROR_SUCCESS) if (RegQueryValueW(HKEY_CLASSES_ROOT, key, param, &paramlen) == ERROR_SUCCESS)
{ {
TRACE("Got ddeexec %s => %s\n", debugstr_w(key), debugstr_w(param)); TRACE("Got ddeexec %s => %s\n", debugstr_w(key), debugstr_w(param));
retval = dde_connect(key, cmd, param, lpFile, env, szCommandline, psei->lpIDList, execfunc, psei, psei_out); retval = dde_connect(key, cmd, param, lpFile, env, szCommandline, psei->lpIDList, execfunc, psei, psei_out, unicode);
} }
else else
{ {
@ -966,9 +984,9 @@ HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpR
} }
/************************************************************************* /*************************************************************************
* ShellExecuteExW32 [Internal] * SHELL_execute [Internal]
*/ */
BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc) BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc, BOOL unicode )
{ {
static const WCHAR wQuote[] = {'"',0}; static const WCHAR wQuote[] = {'"',0};
static const WCHAR wSpace[] = {' ',0}; static const WCHAR wSpace[] = {' ',0};
@ -1296,7 +1314,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfun
} }
TRACE("%s/%s => %s/%s\n", debugstr_w(wszApplicationName), debugstr_w(sei_tmp.lpVerb), debugstr_w(wszQuotedCmd), debugstr_w(lpstrProtocol)); TRACE("%s/%s => %s/%s\n", debugstr_w(wszApplicationName), debugstr_w(sei_tmp.lpVerb), debugstr_w(wszQuotedCmd), debugstr_w(lpstrProtocol));
if (*lpstrProtocol) if (*lpstrProtocol)
retval = execute_from_key(lpstrProtocol, wszApplicationName, env, sei_tmp.lpParameters, execfunc, &sei_tmp, sei); retval = execute_from_key(lpstrProtocol, wszApplicationName, env, sei_tmp.lpParameters, execfunc, &sei_tmp, sei, unicode);
else else
retval = execfunc(wszQuotedCmd, env, FALSE, &sei_tmp, sei); retval = execfunc(wszQuotedCmd, env, FALSE, &sei_tmp, sei);
HeapFree( GetProcessHeap(), 0, env ); HeapFree( GetProcessHeap(), 0, env );
@ -1329,7 +1347,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfun
lpFile += iSize; lpFile += iSize;
while (*lpFile == ':') lpFile++; while (*lpFile == ':') lpFile++;
} }
retval = execute_from_key(lpstrProtocol, lpFile, NULL, sei_tmp.lpParameters, execfunc, &sei_tmp, sei); retval = execute_from_key(lpstrProtocol, lpFile, NULL, sei_tmp.lpParameters, execfunc, &sei_tmp, sei, unicode);
} }
/* Check if file specified is in the form www.??????.*** */ /* Check if file specified is in the form www.??????.*** */
else if (!strncmpiW(lpFile, wWww, 3)) else if (!strncmpiW(lpFile, wWww, 3))
@ -1414,7 +1432,7 @@ BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei)
else else
seiW.lpClass = NULL; seiW.lpClass = NULL;
ret = ShellExecuteExW32 (&seiW, SHELL_ExecuteW); ret = SHELL_execute( &seiW, SHELL_ExecuteW, FALSE );
sei->hInstApp = seiW.hInstApp; sei->hInstApp = seiW.hInstApp;
@ -1436,7 +1454,7 @@ BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei)
*/ */
BOOL WINAPI ShellExecuteExW (LPSHELLEXECUTEINFOW sei) BOOL WINAPI ShellExecuteExW (LPSHELLEXECUTEINFOW sei)
{ {
return ShellExecuteExW32 (sei, SHELL_ExecuteW); return SHELL_execute( sei, SHELL_ExecuteW, TRUE );
} }
/************************************************************************* /*************************************************************************
@ -1465,6 +1483,6 @@ HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile,
sei.dwHotKey = 0; sei.dwHotKey = 0;
sei.hProcess = 0; sei.hProcess = 0;
ShellExecuteExW32 (&sei, SHELL_ExecuteW); SHELL_execute( &sei, SHELL_ExecuteW, TRUE );
return sei.hInstApp; return sei.hInstApp;
} }