wscript.exe: Added engine lookup implementation.
authorJacek Caban <jacek@codeweavers.com>
Tue, 27 Jul 2010 13:52:05 +0000 (15:52 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 28 Jul 2010 14:28:22 +0000 (16:28 +0200)
programs/wscript/Makefile.in
programs/wscript/main.c

index 8d208ba3905971433ad1eecf10fe97da73560fef..36d25f7140785eec6899f523d57e008087715f02 100644 (file)
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = wscript.exe
 APPMODE   = -mwindows -municode
-IMPORTS   =
+IMPORTS   = ole32 advapi32
 EXTRADEFS = -DWINE_NO_UNICODE_MACROS
 
 C_SRCS = \
index 33e14e99b1546b5ce5eca9aec562b962945afa08..5169b749e1eb2ef07c04255132b1af7c348e3f3a 100644 (file)
 
 #include <windef.h>
 #include <winbase.h>
+#include <winreg.h>
+#include <ole2.h>
 
 #include <wine/debug.h>
+#include <wine/unicode.h>
 
 WINE_DEFAULT_DEBUG_CHANNEL(wscript);
 
+static BOOL get_engine_clsid(const WCHAR *ext, CLSID *clsid)
+{
+    WCHAR fileid[64], progid[64];
+    DWORD res;
+    LONG size;
+    HKEY hkey;
+    HRESULT hres;
+
+    static const WCHAR script_engineW[] =
+        {'\\','S','c','r','i','p','t','E','n','g','i','n','e',0};
+
+    res = RegOpenKeyW(HKEY_CLASSES_ROOT, ext, &hkey);
+    if(res != ERROR_SUCCESS)
+        return FALSE;
+
+    size = sizeof(fileid)/sizeof(WCHAR);
+    res = RegQueryValueW(hkey, NULL, fileid, &size);
+    RegCloseKey(hkey);
+    if(res != ERROR_SUCCESS)
+        return FALSE;
+
+    WINE_TRACE("fileid is %s\n", wine_dbgstr_w(fileid));
+
+    strcatW(fileid, script_engineW);
+    res = RegOpenKeyW(HKEY_CLASSES_ROOT, fileid, &hkey);
+    if(res != ERROR_SUCCESS)
+        return FALSE;
+
+    size = sizeof(progid)/sizeof(WCHAR);
+    res = RegQueryValueW(hkey, NULL, progid, &size);
+    RegCloseKey(hkey);
+    if(res != ERROR_SUCCESS)
+        return FALSE;
+
+    WINE_TRACE("ProgID is %s\n", wine_dbgstr_w(progid));
+
+    hres = CLSIDFromProgID(progid, clsid);
+    return SUCCEEDED(hres);
+}
+
 int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow)
 {
+    const WCHAR *ext;
+    CLSID clsid;
+
     WINE_FIXME("(%p %p %s %x)\n", hInst, hPrevInst, wine_dbgstr_w(cmdline), cmdshow);
+
+    if(!*cmdline)
+        return 1;
+
+    ext = strchrW(cmdline, '.');
+    if(!ext)
+        ext = cmdline;
+    if(!get_engine_clsid(ext, &clsid)) {
+        WINE_FIXME("Could not fine engine for %s\n", wine_dbgstr_w(ext));
+        return 1;
+    }
+
     return 0;
 }