Misha Koshelev : shell32: Handle default DDE application names.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 30 08:56:48 CDT 2007
Module: wine
Branch: master
Commit: efb92561e69569991dfdbd8c119d57a74d77e219
URL: http://source.winehq.org/git/wine.git/?a=commit;h=efb92561e69569991dfdbd8c119d57a74d77e219
Author: Misha Koshelev <mk144210 at bcm.edu>
Date: Sun May 27 20:01:10 2007 -0500
shell32: Handle default DDE application names.
---
dlls/shell32/shlexec.c | 47 ++++++++++++++++++++++++++++++++++++++++-
dlls/shell32/tests/shlexec.c | 34 +++++++++++++++---------------
2 files changed, 62 insertions(+), 19 deletions(-)
diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c
index 0d2b364..edb65ea 100644
--- a/dlls/shell32/shlexec.c
+++ b/dlls/shell32/shlexec.c
@@ -780,8 +780,51 @@ static unsigned dde_connect(WCHAR* key, const WCHAR* start, WCHAR* ddeexec,
applen = sizeof(app);
if (RegQueryValueW(HKEY_CLASSES_ROOT, key, app, &applen) != ERROR_SUCCESS)
{
- FIXME("default app name NIY %s\n", debugstr_w(key));
- return 2;
+ WCHAR command[1024], fullpath[MAX_PATH];
+ static const WCHAR wSo[] = { '.','s','o',0 };
+ int sizeSo = sizeof(wSo)/sizeof(WCHAR);
+ LPWSTR ptr = NULL;
+ DWORD ret = 0;
+
+ /* Get application command from start string and find filename of application */
+ if (*start == '"')
+ {
+ strcpyW(command, start+1);
+ if ((ptr = strchrW(command, '"')))
+ *ptr = 0;
+ ret = SearchPathW(NULL, command, wszExe, sizeof(fullpath)/sizeof(WCHAR), fullpath, &ptr);
+ }
+ else
+ {
+ LPWSTR p,space;
+ for (p=(LPWSTR)start; (space=strchrW(p, ' ')); p=space+1)
+ {
+ int idx = space-start;
+ memcpy(command, start, idx*sizeof(WCHAR));
+ command[idx] = '\0';
+ if ((ret = SearchPathW(NULL, command, wszExe, sizeof(fullpath)/sizeof(WCHAR), fullpath, &ptr)))
+ break;
+ }
+ if (!ret)
+ ret = SearchPathW(NULL, start, wszExe, sizeof(fullpath)/sizeof(WCHAR), fullpath, &ptr);
+ }
+
+ if (!ret)
+ {
+ ERR("Unable to find application path for command %s\n", debugstr_w(start));
+ return ERROR_ACCESS_DENIED;
+ }
+ strcpyW(app, ptr);
+
+ /* Remove extensions (including .so) */
+ ptr = app + strlenW(app) - (sizeSo-1);
+ if (strlenW(app) >= sizeSo &&
+ !strcmpW(ptr, wSo))
+ *ptr = 0;
+
+ ptr = strrchrW(app, '.');
+ assert(ptr);
+ *ptr = 0;
}
strcpyW(endkey, wTopic);
diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index 37f736d..2b19a76 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -1099,7 +1099,7 @@ static dde_tests_t dde_tests[] =
{"", "[open(\"%1\")]", "shlexec", NULL, NULL, FALSE, "[open(\"%s\")]", 0x0, 33},
/* Test default DDE application */
- {"", "[open(\"%1\")]", NULL, "dde", NULL, FALSE, "[open(\"%s\")]", 0x1, 33},
+ {"", "[open(\"%1\")]", NULL, "dde", NULL, FALSE, "[open(\"%s\")]", 0x0, 33},
{NULL, NULL, NULL, NULL, 0x0, 0}
};
@@ -1284,37 +1284,37 @@ typedef struct
static dde_default_app_tests_t dde_default_app_tests[] =
{
/* Test unquoted existing filename with a space */
- {"%s\\test file.exe", "test file", 0x1, 33},
- {"%s\\test file.exe param", "test file", 0x1, 33},
+ {"%s\\test file.exe", "test file", 0x0, 33},
+ {"%s\\test file.exe param", "test file", 0x0, 33},
/* Test quoted existing filename with a space */
- {"\"%s\\test file.exe\"", "test file", 0x1, 33},
- {"\"%s\\test file.exe\" param", "test file", 0x1, 33},
+ {"\"%s\\test file.exe\"", "test file", 0x0, 33},
+ {"\"%s\\test file.exe\" param", "test file", 0x0, 33},
/* Test unquoted filename with a space that doesn't exist, but
* test2.exe does */
- {"%s\\test2 file.exe", "test2", 0x1, 33},
- {"%s\\test2 file.exe param", "test2", 0x1, 33},
+ {"%s\\test2 file.exe", "test2", 0x0, 33},
+ {"%s\\test2 file.exe param", "test2", 0x0, 33},
/* Test quoted filename with a space that does not exist */
- {"\"%s\\test2 file.exe\"", "", 0x1, 5},
- {"\"%s\\test2 file.exe\" param", "", 0x1, 5},
+ {"\"%s\\test2 file.exe\"", "", 0x0, 5},
+ {"\"%s\\test2 file.exe\" param", "", 0x0, 5},
/* Test filename supplied without the extension */
- {"%s\\test2", "test2", 0x1, 33},
- {"%s\\test2 param", "test2", 0x1, 33},
+ {"%s\\test2", "test2", 0x0, 33},
+ {"%s\\test2 param", "test2", 0x0, 33},
/* Test an unquoted non-existent filename */
- {"%s\\notexist.exe", "", 0x1, 5},
- {"%s\\notexist.exe param", "", 0x1, 5},
+ {"%s\\notexist.exe", "", 0x0, 5},
+ {"%s\\notexist.exe param", "", 0x0, 5},
/* Test an application that will be found on the path */
- {"cmd", "cmd", 0x1, 33},
- {"cmd param", "cmd", 0x1, 33},
+ {"cmd", "cmd", 0x0, 33},
+ {"cmd param", "cmd", 0x0, 33},
/* Test an application that will not be found on the path */
- {"xyzwxyzwxyz", "", 0x1, 5},
- {"xyzwxyzwxyz param", "", 0x1, 5},
+ {"xyzwxyzwxyz", "", 0x0, 5},
+ {"xyzwxyzwxyz param", "", 0x0, 5},
{NULL, NULL, 0, 0}
};
More information about the wine-cvs
mailing list