diff --git a/programs/wscript/host.c b/programs/wscript/host.c index 42343b140f6..b556d74ab23 100644 --- a/programs/wscript/host.c +++ b/programs/wscript/host.c @@ -163,8 +163,15 @@ static HRESULT WINAPI Host_Quit(IHost *iface, int ExitCode) static HRESULT WINAPI Host_get_ScriptName(IHost *iface, BSTR *out_ScriptName) { - WINE_FIXME("(%p)\n", out_ScriptName); - return E_NOTIMPL; + WCHAR *scriptName; + + WINE_TRACE("(%p)\n", out_ScriptName); + + scriptName = strrchrW(scriptFullName, '\\'); + ++scriptName; + if(!(*out_ScriptName = SysAllocString(scriptName))) + return E_OUTOFMEMORY; + return S_OK; } static HRESULT WINAPI Host_get_ScriptFullName(IHost *iface, BSTR *out_ScriptFullName) diff --git a/programs/wscript/main.c b/programs/wscript/main.c index 0ea701130d6..8bf071260ae 100644 --- a/programs/wscript/main.c +++ b/programs/wscript/main.c @@ -36,6 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wscript); static const WCHAR wscriptW[] = {'W','S','c','r','i','p','t',0}; static const WCHAR wshW[] = {'W','S','H',0}; +WCHAR scriptFullName[MAX_PATH]; ITypeInfo *host_ti; @@ -326,6 +327,7 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cm WCHAR **argv; CLSID clsid; int argc, i; + DWORD res; WINE_TRACE("(%p %p %s %x)\n", hInst, hPrevInst, wine_dbgstr_w(cmdline), cmdshow); @@ -346,6 +348,9 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cm WINE_FIXME("No file name specified\n"); return 1; } + res = GetFullPathNameW(filename, sizeof(scriptFullName)/sizeof(WCHAR), scriptFullName, NULL); + if(!res || res > sizeof(scriptFullName)/sizeof(WCHAR)) + return 1; ext = strchrW(filename, '.'); if(!ext) diff --git a/programs/wscript/tests/run.c b/programs/wscript/tests/run.c index 2f5deddfc81..9595942c825 100644 --- a/programs/wscript/tests/run.c +++ b/programs/wscript/tests/run.c @@ -61,6 +61,7 @@ DEFINE_EXPECT(reportSuccess); #define DISPID_TESTOBJ_REPORTSUCCESS 10002 #define DISPID_TESTOBJ_WSCRIPTFULLNAME 10003 #define DISPID_TESTOBJ_WSCRIPTPATH 10004 +#define DISPID_TESTOBJ_WSCRIPTSCRIPTNAME 10005 #define TESTOBJ_CLSID "{178fc166-f585-4e24-9c13-4bb7faf80646}" @@ -87,6 +88,18 @@ static const WCHAR* mystrrchr(const WCHAR *str, WCHAR ch) return pos; } +static BSTR a2bstr(const char *str) +{ + BSTR ret; + int len; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + ret = SysAllocStringLen(NULL, len-1); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + + return ret; +} + static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) { if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch)) { @@ -137,6 +150,8 @@ static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, rgDispId[i] = DISPID_TESTOBJ_WSCRIPTFULLNAME; }else if(!strcmp_wa(rgszNames[i], "wscriptPath")) { rgDispId[i] = DISPID_TESTOBJ_WSCRIPTPATH; + }else if(!strcmp_wa(rgszNames[i], "wscriptScriptName")) { + rgDispId[i] = DISPID_TESTOBJ_WSCRIPTSCRIPTNAME; }else { ok(0, "unexpected name %s\n", wine_dbgstr_w(rgszNames[i])); return DISP_E_UNKNOWNNAME; @@ -214,6 +229,23 @@ static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REF return E_OUTOFMEMORY; break; } + case DISPID_TESTOBJ_WSCRIPTSCRIPTNAME: + { + char fullPath[MAX_PATH]; + char *pos; + long res; + + ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags); + ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs); + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); + V_VT(pVarResult) = VT_BSTR; + res = GetFullPathNameA(script_name, sizeof(fullPath)/sizeof(WCHAR), fullPath, &pos); + if(!res || res > sizeof(fullPath)/sizeof(WCHAR)) + return E_FAIL; + if(!(V_BSTR(pVarResult) = SysAllocString(a2bstr(pos)))) + return E_OUTOFMEMORY; + break; + } default: ok(0, "unexpected dispIdMember %d\n", dispIdMember); return E_NOTIMPL; diff --git a/programs/wscript/tests/run.js b/programs/wscript/tests/run.js index 225abef395b..e9d7776c918 100644 --- a/programs/wscript/tests/run.js +++ b/programs/wscript/tests/run.js @@ -30,5 +30,6 @@ ok(typeof(WScript.Version) === "string", "typeof(WScript.Version) = " + typeof(W ok(typeof(WScript.BuildVersion) === "number", "typeof(WScript.BuldVersion) = " + typeof(WScript.BuldVersion)); ok(WScript.FullName === winetest.wscriptFullName, "WScript.FullName = ", WScript.FullName); ok(WScript.Path === winetest.wscriptPath, "WScript.Path = ", WScript.Path); +ok(WScript.ScriptName === winetest.wscriptScriptName, "WScript.ScriptName = " + WScript.ScriptName); winetest.reportSuccess(); diff --git a/programs/wscript/wscript.h b/programs/wscript/wscript.h index a5c642d29ef..642784ed803 100644 --- a/programs/wscript/wscript.h +++ b/programs/wscript/wscript.h @@ -21,3 +21,5 @@ extern IHost host_obj; extern ITypeInfo *host_ti; + +extern WCHAR scriptFullName[];