From: Robert Wilhelm robert.wilhelm@gmx.net
DWORD is unsigned and will be converted to VT_UI4 variant when used from VBScript. But VT_UI4 is no VBScript data type and should not be used as retval.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53542
Signed-off-by: Robert Wilhelm robert.wilhelm@gmx.net --- dlls/wshom.ocx/shell.c | 6 ++++-- dlls/wshom.ocx/tests/wshom.c | 15 ++++++++------- dlls/wshom.ocx/tests/wshom.idl | 2 +- dlls/wshom.ocx/wshom.idl | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/dlls/wshom.ocx/shell.c b/dlls/wshom.ocx/shell.c index e04844458b1..41913dcadd5 100644 --- a/dlls/wshom.ocx/shell.c +++ b/dlls/wshom.ocx/shell.c @@ -1329,7 +1329,7 @@ static WCHAR *split_command( BSTR cmd, WCHAR **params ) return ret; }
-static HRESULT WINAPI WshShell3_Run(IWshShell3 *iface, BSTR cmd, VARIANT *style, VARIANT *wait, DWORD *exit_code) +static HRESULT WINAPI WshShell3_Run(IWshShell3 *iface, BSTR cmd, VARIANT *style, VARIANT *wait, int *exit_code) { SHELLEXECUTEINFOW info; int waitforprocess; @@ -1384,9 +1384,11 @@ static HRESULT WINAPI WshShell3_Run(IWshShell3 *iface, BSTR cmd, VARIANT *style, { if (waitforprocess) { + DWORD code; WaitForSingleObject(info.hProcess, INFINITE); - GetExitCodeProcess(info.hProcess, exit_code); + GetExitCodeProcess(info.hProcess, &code); CloseHandle(info.hProcess); + *exit_code = code; } else *exit_code = 0; diff --git a/dlls/wshom.ocx/tests/wshom.c b/dlls/wshom.ocx/tests/wshom.c index 0e30ea9ed9a..4867843678a 100644 --- a/dlls/wshom.ocx/tests/wshom.c +++ b/dlls/wshom.ocx/tests/wshom.c @@ -81,7 +81,8 @@ static void test_wshshell(void) EXCEPINFO ei; VARIANT arg, res, arg2; BSTR str, ret; - DWORD retval, attrs; + int retval; + DWORD attrs; UINT err;
hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, @@ -227,19 +228,19 @@ static void test_wshshell(void) retval = 10; hr = IWshShell3_Run(sh3, str, NULL, &arg2, &retval); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - ok(retval == 10, "Unexpected retval %lu.\n", retval); + ok(retval == 10, "Unexpected retval %d.\n", retval);
retval = 10; hr = IWshShell3_Run(sh3, str, &arg, NULL, &retval); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - ok(retval == 10, "Unexpected retval %lu.\n", retval); + ok(retval == 10, "Unexpected retval %d.\n", retval);
retval = 10; V_VT(&arg2) = VT_ERROR; V_ERROR(&arg2) = 0; hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval); ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#lx.\n", hr); - ok(retval == 10, "Unexpected retval %lu.\n", retval); + ok(retval == 10, "Unexpected retval %d.\n", retval); SysFreeString(str);
V_VT(&arg2) = VT_BOOL; @@ -249,14 +250,14 @@ static void test_wshshell(void) str = SysAllocString(L"cmd.exe /c rd /s /q c:\nosuchdir"); hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %lu.\n", retval); + todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval); SysFreeString(str);
retval = 0xdeadbeef; str = SysAllocString(L""cmd.exe " /c rd /s /q c:\nosuchdir"); hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %lu.\n", retval); + todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval); SysFreeString(str);
GetSystemDirectoryW(path, ARRAY_SIZE(path)); @@ -280,7 +281,7 @@ static void test_wshshell(void) str = SysAllocString(buf); hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %lu.\n", retval); + todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval); SysFreeString(str);
DeleteFileW(path2); diff --git a/dlls/wshom.ocx/tests/wshom.idl b/dlls/wshom.ocx/tests/wshom.idl index 00391d52838..a0175bb1604 100644 --- a/dlls/wshom.ocx/tests/wshom.idl +++ b/dlls/wshom.ocx/tests/wshom.idl @@ -528,7 +528,7 @@ library IWshRuntimeLibrary [in] BSTR Command, [in, optional] VARIANT* WindowStyle, [in, optional] VARIANT* WaitOnReturn, - [out, retval] DWORD* out_ExitCode); + [out, retval] int* out_ExitCode);
[id(0x03e9)] HRESULT Popup( diff --git a/dlls/wshom.ocx/wshom.idl b/dlls/wshom.ocx/wshom.idl index 8d4a8f03e17..c69362d6fac 100644 --- a/dlls/wshom.ocx/wshom.idl +++ b/dlls/wshom.ocx/wshom.idl @@ -528,7 +528,7 @@ library IWshRuntimeLibrary [in] BSTR Command, [in, optional] VARIANT* WindowStyle, [in, optional] VARIANT* WaitOnReturn, - [out, retval] DWORD* out_ExitCode); + [out, retval] int* out_ExitCode);
[id(0x03e9)] HRESULT Popup(