Try using the Mozilla Active X control in MSHTML
Mike McCormack
mike at codeweavers.com
Fri Jan 16 00:06:48 CST 2004
Hi,
Since some people have been complaining that MSHTML is a useless
distraction in it's current form (there's some element of truth in
that), here's a small patch to redirect calls to Mozilla's Active X
control. You need to add a "mshtml"="builtin,native" override in the
config file and download and install the control before this patch can
try to use it:
http://www.iol.ie/~locka/mozilla/control.htm
This patch hasn't been tested too much... but it's better than the
current implementation of MSHTML :)
Mike
You can remove dlls/mshtml/document.c from the CVS after applying this
patch.
ChangeLog:
* Try using the Mozilla Active X control in MSHTML
-------------- next part --------------
Index: dlls/mshtml/main.c
===================================================================
RCS file: /home/wine/wine/dlls/mshtml/main.c,v
retrieving revision 1.2
diff -u -r1.2 main.c
--- dlls/mshtml/main.c 9 Sep 2003 19:39:32 -0000 1.2
+++ dlls/mshtml/main.c 16 Jan 2004 05:34:23 -0000
@@ -22,172 +22,135 @@
#include "config.h"
#include <stdarg.h>
+#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
+#include "winnls.h"
+#include "winreg.h"
#include "ole2.h"
#include "uuids.h"
+#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
-extern HRESULT HTMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj);
+#include "initguid.h"
-/* For the moment, do nothing here. */
-BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
-{
- switch(fdwReason) {
- case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hInstDLL);
- break;
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
-}
+DEFINE_GUID( CLSID_MozillaBrowser, 0x1339B54C,0x3453,0x11D2,0x93,0xB9,0x00,0x00,0x00,0x00,0x00,0x00);
-/******************************************************************************
- * MSHTML ClassFactory
- */
-typedef struct {
- IClassFactory ITF_IClassFactory;
-
- DWORD ref;
- HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
-} IClassFactoryImpl;
+typedef HRESULT WINAPI (*fnGetClassObject)(REFCLSID rclsid, REFIID iid, LPVOID *ppv);
+typedef BOOL WINAPI (*fnCanUnloadNow)();
-struct object_creation_info
-{
- const CLSID *clsid;
- LPCSTR szClassName;
- HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
-};
+HMODULE hMozCtl;
-static const struct object_creation_info object_creation[] =
-{
- { &CLSID_HTMLDocument, "HTMLDocument", HTMLDocument_create },
-};
-static HRESULT WINAPI
-HTMLCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
+/* convert a guid to a wide character string */
+static void MSHTML_guid2wstr( const GUID *guid, LPWSTR wstr )
{
- ICOM_THIS(IClassFactoryImpl,iface);
-
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IClassFactory))
- {
- IClassFactory_AddRef(iface);
- *ppobj = This;
- return S_OK;
- }
-
- WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI HTMLCF_AddRef(LPCLASSFACTORY iface) {
- ICOM_THIS(IClassFactoryImpl,iface);
- return ++(This->ref);
+ char str[40];
+
+ sprintf(str, "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
+ guid->Data1, guid->Data2, guid->Data3,
+ guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
+ guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
+ MultiByteToWideChar( CP_ACP, 0, str, -1, wstr, 40 );
}
-static ULONG WINAPI HTMLCF_Release(LPCLASSFACTORY iface) {
- ICOM_THIS(IClassFactoryImpl,iface);
+static BOOL MSHTML_GetMozctlPath( LPWSTR szPath, DWORD sz )
+{
+ DWORD r, type;
+ BOOL ret = FALSE;
+ HKEY hkey;
+ const WCHAR szPre[] = {
+ 'S','o','f','t','w','a','r','e','\\',
+ 'C','l','a','s','s','e','s','\\',
+ 'C','L','S','I','D','\\',0 };
+ const WCHAR szPost[] = {
+ '\\','I','n','p','r','o','c','S','e','r','v','e','r','3','2',0 };
+ WCHAR szRegPath[(sizeof(szPre)+sizeof(szPost))/sizeof(WCHAR)+40];
- ULONG ref = --This->ref;
+ strcpyW( szRegPath, szPre );
+ MSHTML_guid2wstr( &CLSID_MozillaBrowser, &szRegPath[strlenW(szRegPath)] );
+ strcatW( szRegPath, szPost );
- if (ref == 0)
- HeapFree(GetProcessHeap(), 0, This);
+ TRACE("key = %s\n", debugstr_w( szRegPath ) );
- return ref;
-}
+ r = RegOpenKeyW( HKEY_LOCAL_MACHINE, szRegPath, &hkey );
+ if( r != ERROR_SUCCESS )
+ return FALSE;
+ r = RegQueryValueExW( hkey, NULL, NULL, &type, (LPBYTE)szPath, &sz );
+ ret = ( r == ERROR_SUCCESS ) && ( type == REG_SZ );
+ RegCloseKey( hkey );
-static HRESULT WINAPI HTMLCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
- REFIID riid, LPVOID *ppobj) {
- ICOM_THIS(IClassFactoryImpl,iface);
- HRESULT hres;
- LPUNKNOWN punk;
-
- TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
-
- hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- hres = IUnknown_QueryInterface(punk, riid, ppobj);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- IUnknown_Release(punk);
- return hres;
-}
-
-static HRESULT WINAPI HTMLCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- ICOM_THIS(IClassFactoryImpl,iface);
- FIXME("(%p)->(%d),stub!\n",This,dolock);
- return S_OK;
+ return ret;
}
-static ICOM_VTABLE(IClassFactory) HTMLCF_Vtbl =
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
- ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- HTMLCF_QueryInterface,
- HTMLCF_AddRef,
- HTMLCF_Release,
- HTMLCF_CreateInstance,
- HTMLCF_LockServer
-};
+ WCHAR szPath[MAX_PATH];
+ switch(fdwReason) {
+ case DLL_PROCESS_ATTACH:
+ if( !MSHTML_GetMozctlPath( szPath, sizeof szPath ) )
+ {
+ MESSAGE("You need to install the Mozilla ActiveX control to\n");
+ MESSAGE("use Wine's builtin MSHTML dll.\n");
+ return FALSE;
+ }
+ hMozCtl = LoadLibraryExW(szPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ if( !hMozCtl )
+ {
+ ERR("Can't load the Mozilla ActiveX control\n");
+ return FALSE;
+ }
+ break;
+ case DLL_PROCESS_DETACH:
+ FreeLibrary( hMozCtl );
+ break;
+ }
+ return TRUE;
+}
HRESULT WINAPI MSHTML_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
{
- int i;
- IClassFactoryImpl *factory;
+ HRESULT r;
+ fnGetClassObject pGetClassObject;
- TRACE("%s %s %p\n",debugstr_guid(rclsid), debugstr_guid(iid), ppv);
-
- if ( !IsEqualGUID( &IID_IClassFactory, iid )
- && ! IsEqualGUID( &IID_IUnknown, iid) )
- return E_NOINTERFACE;
-
- for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
- {
- if (IsEqualGUID(object_creation[i].clsid, rclsid))
- break;
- }
+ TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv );
- if (i == sizeof(object_creation)/sizeof(object_creation[0]))
- {
- FIXME("%s: no class found.\n", debugstr_guid(rclsid));
- return CLASS_E_CLASSNOTAVAILABLE;
- }
+ if( !IsEqualGUID( &CLSID_HTMLDocument, rclsid ) )
+ WARN("Unknown class %s\n", debugstr_guid(rclsid) );
- TRACE("Creating a class factory for %s\n",object_creation[i].szClassName);
+ pGetClassObject = (fnGetClassObject) GetProcAddress( hMozCtl, "DllGetClassObject" );
+ if( !pGetClassObject )
+ return CLASS_E_CLASSNOTAVAILABLE;
+ r = pGetClassObject( &CLSID_MozillaBrowser, iid, ppv );
- factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory));
- if (factory == NULL) return E_OUTOFMEMORY;
+ TRACE("r = %08lx *ppv = %p\n", r, *ppv );
- factory->ITF_IClassFactory.lpVtbl = &HTMLCF_Vtbl;
- factory->ref = 1;
+ return S_OK;
+}
- factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
+BOOL WINAPI MSHTML_DllCanUnloadNow(void)
+{
+ fnCanUnloadNow pCanUnloadNow;
+ BOOL r;
- *ppv = &(factory->ITF_IClassFactory);
+ TRACE("\n");
- TRACE("(%p) <- %p\n", ppv, &(factory->ITF_IClassFactory) );
+ pCanUnloadNow = (fnCanUnloadNow) GetProcAddress( hMozCtl, "DllCanUnloadNow" );
+ if( !pCanUnloadNow )
+ return FALSE;
+ r = pCanUnloadNow();
- return S_OK;
-}
+ TRACE("r = %d\n", r);
-HRESULT WINAPI MSHTML_DllCanUnloadNow(void)
-{
- FIXME("\n");
- return S_FALSE;
+ return r;
}
/* appears to have the same prototype as WinMain */
More information about the wine-patches
mailing list