MSCMS: new dll

Mike McCormack mike at codeweavers.com
Mon Sep 20 06:29:48 CDT 2004



Mike Hearn wrote:

> Actually we pretty much have to "statically link" the ActiveX control as 
> it must be built as Win32 code. In fact the easiest thing to do is 
> simply download the prebuilt version from Adams webpage, as compiling 
> Mozilla is sort of a pain, then drop the PE DLL into c:\windows\system.
> 
> If it weren't for Alexandres dislike of binaries in CVS I'd have asked 

I think a good solution would be to add code to wine to offer to 
download it and install when it is needed.

That should be only a few lines of code using MessageBox() and 
URLDownloadToFileW()... something like the following patch, but perhaps 
with a progress bar, and internationalized messages?

Mike
-------------- next part --------------
Index: dlls/shdocvw/shdocvw_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shdocvw/shdocvw_main.c,v
retrieving revision 1.20
diff -u -r1.20 shdocvw_main.c
--- dlls/shdocvw/shdocvw_main.c	25 Aug 2004 17:33:47 -0000	1.20
+++ dlls/shdocvw/shdocvw_main.c	20 Sep 2004 09:53:28 -0000
@@ -45,6 +45,10 @@
 #define MOZILLA_ACTIVEX_MESSAGE "You need to install the Mozilla ActiveX control to\n" \
                                 "use Wine's builtin CLSID_WebBrowser from SHDOCVW.DLL"
 
+#define MOZILLA_ACTIVEX_DOWNLOAD "This application is requesting an ActiveX browser object\n" \
+                                 "but the Mozilla Active X control is currently not installed." \
+                                 "Do you wish to download and install it?"
+
 DEFINE_GUID( CLSID_MozillaBrowser, 0x1339B54C,0x3453,0x11D2,0x93,0xB9,0x00,0x00,0x00,0x00,0x00,0x00);
 
 typedef HRESULT (WINAPI *fnGetClassObject)(REFCLSID rclsid, REFIID iid, LPVOID *ppv);
@@ -125,6 +129,47 @@
     return S_FALSE;
 }
 
+static BOOL SHDOCVW_TryDownloadMozillaControl()
+{
+    char *szUrl = "http://www.iol.ie/~locka/mozilla/MozillaControl16.exe";
+    char *szProg = "%TEMP%\\MozillaControl16.exe";
+    char path[MAX_PATH];
+    typeof(URLDownloadToFileA) *df;
+    HMODULE hUrlMon;
+    DWORD r;
+    STARTUPINFOA si;
+    PROCESS_INFORMATION pi;
+    MESSAGE(MOZILLA_ACTIVEX_DOWNLOAD "\n");
+
+    hUrlMon = LoadLibraryA("urlmon");
+    if( !hUrlMon )
+        return FALSE;
+
+    df = (typeof(URLDownloadToFileA)*) GetProcAddress( hUrlMon, "URLDownloadToFileA" );
+    if( !df )
+        return FALSE;
+
+    r = MessageBoxA(NULL, MOZILLA_ACTIVEX_DOWNLOAD, "Wine", MB_YESNO | MB_ICONQUESTION);
+    if( r != IDYES )
+        return FALSE;
+
+    r = ExpandEnvironmentStringsA( szProg, path, MAX_PATH );
+    if( !r )
+        return FALSE;
+    
+    r = df( NULL, szUrl, path, 0, NULL );
+    if( r != S_OK )
+        return FALSE;
+
+    memset( &si, 0, sizeof si );
+    si.cb = sizeof si;
+    r = CreateProcessA( path, NULL, NULL, NULL, 0, 0, NULL, NULL, &si, &pi );
+    if( !r )
+        return FALSE;
+
+    WaitForSingleObject( pi.hProcess, INFINITE );
+    return TRUE;
+}
 
 static BOOL SHDOCVW_TryLoadMozillaControl()
 {
@@ -134,6 +179,9 @@
         return hMozCtl ? TRUE : FALSE;
 
     if( !SHDOCVW_GetMozctlPath( szPath, sizeof szPath ) )
+        SHDOCVW_TryDownloadMozillaControl();
+
+    if( !SHDOCVW_GetMozctlPath( szPath, sizeof szPath ) )
     {
         MESSAGE(MOZILLA_ACTIVEX_MESSAGE "\n");
         MessageBoxA(NULL, MOZILLA_ACTIVEX_MESSAGE, "Wine", MB_OK | MB_ICONEXCLAMATION);
@@ -143,7 +191,7 @@
     hMozCtl = LoadLibraryExW(szPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
     if( !hMozCtl )
     {
-        ERR("Can't load the Mozilla ActiveX control\n");
+        ERR("Can't load the Mozilla ActiveX control from %s\n", debugstr_w(szPath));
         return FALSE;
     }
     return TRUE;


More information about the wine-devel mailing list