mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-21 11:04:10 +00:00
ieframe: Add stub implementation of InternetExplorerManager.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1dbf6c8f54
commit
1bee19a3f6
|
@ -312,13 +312,16 @@ TID_LIST
|
||||||
} tid_t;
|
} tid_t;
|
||||||
|
|
||||||
HRESULT get_typeinfo(tid_t,ITypeInfo**) DECLSPEC_HIDDEN;
|
HRESULT get_typeinfo(tid_t,ITypeInfo**) DECLSPEC_HIDDEN;
|
||||||
HRESULT register_class_object(BOOL) DECLSPEC_HIDDEN;
|
|
||||||
|
|
||||||
HRESULT WINAPI CUrlHistory_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
HRESULT WINAPI CUrlHistory_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
HRESULT WINAPI InternetExplorer_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
HRESULT WINAPI InternetExplorer_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
HRESULT WINAPI InternetShortcut_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
HRESULT WINAPI InternetShortcut_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
HRESULT WINAPI WebBrowser_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
HRESULT WINAPI WebBrowser_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
HRESULT WINAPI WebBrowserV1_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
HRESULT WINAPI WebBrowserV1_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
|
HRESULT WINAPI InternetExplorerManager_Create(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
extern IClassFactory InternetExplorerFactory DECLSPEC_HIDDEN;
|
||||||
|
extern IClassFactory InternetExplorerManagerFactory DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern LONG module_ref DECLSPEC_HIDDEN;
|
extern LONG module_ref DECLSPEC_HIDDEN;
|
||||||
extern HINSTANCE ieframe_instance DECLSPEC_HIDDEN;
|
extern HINSTANCE ieframe_instance DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -18,9 +18,11 @@
|
||||||
|
|
||||||
#include "ieframe.h"
|
#include "ieframe.h"
|
||||||
|
|
||||||
|
#include "initguid.h"
|
||||||
#include "rpcproxy.h"
|
#include "rpcproxy.h"
|
||||||
#include "shlguid.h"
|
#include "shlguid.h"
|
||||||
#include "isguids.h"
|
#include "isguids.h"
|
||||||
|
#include "ieautomation.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
@ -238,32 +240,17 @@ static const IClassFactoryVtbl InternetExplorerFactoryVtbl = {
|
||||||
ClassFactory_LockServer
|
ClassFactory_LockServer
|
||||||
};
|
};
|
||||||
|
|
||||||
static IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
|
IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
|
||||||
|
|
||||||
HRESULT register_class_object(BOOL do_reg)
|
static const IClassFactoryVtbl InternetExplorerManagerFactoryVtbl = {
|
||||||
{
|
ClassFactory_QueryInterface,
|
||||||
HRESULT hres;
|
ClassFactory_AddRef,
|
||||||
|
ClassFactory_Release,
|
||||||
|
InternetExplorerManager_Create,
|
||||||
|
ClassFactory_LockServer
|
||||||
|
};
|
||||||
|
|
||||||
static DWORD cookie;
|
IClassFactory InternetExplorerManagerFactory = { &InternetExplorerManagerFactoryVtbl };
|
||||||
|
|
||||||
if(do_reg) {
|
|
||||||
hres = CoRegisterClassObject(&CLSID_InternetExplorer,
|
|
||||||
(IUnknown*)&InternetExplorerFactory, CLSCTX_SERVER,
|
|
||||||
REGCLS_MULTIPLEUSE|REGCLS_SUSPENDED, &cookie);
|
|
||||||
if (FAILED(hres)) {
|
|
||||||
ERR("failed to register object %08x\n", hres);
|
|
||||||
return hres;
|
|
||||||
}
|
|
||||||
|
|
||||||
hres = CoResumeClassObjects();
|
|
||||||
if(SUCCEEDED(hres))
|
|
||||||
return hres;
|
|
||||||
|
|
||||||
ERR("failed to resume object %08x\n", hres);
|
|
||||||
}
|
|
||||||
|
|
||||||
return CoRevokeClassObject(cookie);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DllCanUnloadNow (ieframe.@)
|
* DllCanUnloadNow (ieframe.@)
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "shlwapi.h"
|
#include "shlwapi.h"
|
||||||
#include "intshcut.h"
|
#include "intshcut.h"
|
||||||
#include "ddeml.h"
|
#include "ddeml.h"
|
||||||
|
#include "ieautomation.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
@ -839,6 +840,92 @@ HRESULT WINAPI InternetExplorer_Create(IClassFactory *iface, IUnknown *pOuter, R
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* IInternetExplorerManager implementation
|
||||||
|
*/
|
||||||
|
struct InternetExplorerManager {
|
||||||
|
IInternetExplorerManager IInternetExplorerManager_iface;
|
||||||
|
LONG ref;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline InternetExplorerManager *impl_from_IInternetExplorerManager(IInternetExplorerManager *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, InternetExplorerManager, IInternetExplorerManager_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI InternetExplorerManager_QueryInterface(IInternetExplorerManager *iface, REFIID riid, void **out)
|
||||||
|
{
|
||||||
|
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), out);
|
||||||
|
|
||||||
|
if (IsEqualGUID(riid, &IID_IInternetExplorerManager) || IsEqualGUID(riid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
IInternetExplorerManager_AddRef(iface);
|
||||||
|
*out = iface;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
FIXME("interface %s not implemented\n", debugstr_guid(riid));
|
||||||
|
*out = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI InternetExplorerManager_AddRef(IInternetExplorerManager *iface)
|
||||||
|
{
|
||||||
|
InternetExplorerManager *This = impl_from_IInternetExplorerManager(iface);
|
||||||
|
ULONG ref = InterlockedIncrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("(%p) increasing refcount to %u\n", iface, ref);
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI InternetExplorerManager_Release(IInternetExplorerManager *iface)
|
||||||
|
{
|
||||||
|
InternetExplorerManager *This = impl_from_IInternetExplorerManager(iface);
|
||||||
|
ULONG ref = InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("(%p) decreasing refcount to %u\n", iface, ref);
|
||||||
|
|
||||||
|
if (ref == 0)
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI InternetExplorerManager_CreateObject(IInternetExplorerManager *iface, DWORD config, LPCWSTR url, REFIID riid, void **ppv)
|
||||||
|
{
|
||||||
|
FIXME("(%p)->(0x%x, %s, %s, %p) stub!\n", iface, config, debugstr_w(url), debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IInternetExplorerManagerVtbl InternetExplorerManager_vtbl =
|
||||||
|
{
|
||||||
|
InternetExplorerManager_QueryInterface,
|
||||||
|
InternetExplorerManager_AddRef,
|
||||||
|
InternetExplorerManager_Release,
|
||||||
|
InternetExplorerManager_CreateObject,
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT WINAPI InternetExplorerManager_Create(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppv)
|
||||||
|
{
|
||||||
|
InternetExplorerManager *ret;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
|
if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret))))
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
ret->IInternetExplorerManager_iface.lpVtbl = &InternetExplorerManager_vtbl;
|
||||||
|
ret->ref = 1;
|
||||||
|
|
||||||
|
hr = IInternetExplorerManager_QueryInterface(&ret->IInternetExplorerManager_iface, riid, ppv);
|
||||||
|
IInternetExplorerManager_Release(&ret->IInternetExplorerManager_iface);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
void released_obj(void)
|
void released_obj(void)
|
||||||
{
|
{
|
||||||
if(!InterlockedDecrement(&obj_cnt))
|
if(!InterlockedDecrement(&obj_cnt))
|
||||||
|
@ -1036,21 +1123,17 @@ DWORD WINAPI IEWinMain(const WCHAR *cmdline, int nShowWindow)
|
||||||
{
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
BOOL embedding = FALSE, nohome = FALSE;
|
BOOL embedding = FALSE, nohome = FALSE, manager = FALSE;
|
||||||
|
DWORD reg_cookie;
|
||||||
|
|
||||||
static const WCHAR embeddingW[] = {'-','e','m','b','e','d','d','i','n','g',0};
|
static const WCHAR embeddingW[] = {'-','e','m','b','e','d','d','i','n','g',0};
|
||||||
static const WCHAR nohomeW[] = {'-','n','o','h','o','m','e',0};
|
static const WCHAR nohomeW[] = {'-','n','o','h','o','m','e',0};
|
||||||
|
static const WCHAR startmanagerW[] = {'-','s','t','a','r','t','m','a','n','a','g','e','r',0};
|
||||||
|
|
||||||
TRACE("%s %d\n", debugstr_w(cmdline), nShowWindow);
|
TRACE("%s %d\n", debugstr_w(cmdline), nShowWindow);
|
||||||
|
|
||||||
CoInitialize(NULL);
|
CoInitialize(NULL);
|
||||||
|
|
||||||
hres = register_class_object(TRUE);
|
|
||||||
if(FAILED(hres)) {
|
|
||||||
CoUninitialize();
|
|
||||||
ExitProcess(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
init_dde();
|
init_dde();
|
||||||
|
|
||||||
while (*cmdline)
|
while (*cmdline)
|
||||||
|
@ -1066,12 +1149,30 @@ DWORD WINAPI IEWinMain(const WCHAR *cmdline, int nShowWindow)
|
||||||
embedding = TRUE;
|
embedding = TRUE;
|
||||||
else if (!strncmpiW(cmdline, nohomeW, length))
|
else if (!strncmpiW(cmdline, nohomeW, length))
|
||||||
nohome = TRUE;
|
nohome = TRUE;
|
||||||
|
else if (!strncmpiW(cmdline, startmanagerW, length))
|
||||||
|
manager = TRUE;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
cmdline += length;
|
cmdline += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (manager)
|
||||||
|
hres = CoRegisterClassObject(&CLSID_InternetExplorerManager,
|
||||||
|
(IUnknown*)&InternetExplorerManagerFactory, CLSCTX_SERVER,
|
||||||
|
REGCLS_SINGLEUSE, ®_cookie);
|
||||||
|
else
|
||||||
|
hres = CoRegisterClassObject(&CLSID_InternetExplorer,
|
||||||
|
(IUnknown*)&InternetExplorerFactory, CLSCTX_SERVER,
|
||||||
|
REGCLS_MULTIPLEUSE, ®_cookie);
|
||||||
|
|
||||||
|
if (FAILED(hres))
|
||||||
|
{
|
||||||
|
ERR("failed to register CLSID_InternetExplorer%s: %08x\n", manager ? "Manager" : "", hres);
|
||||||
|
CoUninitialize();
|
||||||
|
ExitProcess(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!embedding)
|
if (!embedding)
|
||||||
{
|
{
|
||||||
if(!create_ie_window(nohome, cmdline))
|
if(!create_ie_window(nohome, cmdline))
|
||||||
|
@ -1088,7 +1189,7 @@ DWORD WINAPI IEWinMain(const WCHAR *cmdline, int nShowWindow)
|
||||||
DispatchMessageW(&msg);
|
DispatchMessageW(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
register_class_object(FALSE);
|
CoRevokeClassObject(reg_cookie);
|
||||||
release_dde();
|
release_dde();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
#include "exdisp.h"
|
#include "exdisp.h"
|
||||||
#include "exdispid.h"
|
#include "exdispid.h"
|
||||||
#include "mshtml.h"
|
#include "mshtml.h"
|
||||||
|
#include "initguid.h"
|
||||||
|
#include "ieautomation.h"
|
||||||
|
|
||||||
#define DEFINE_EXPECT(func) \
|
#define DEFINE_EXPECT(func) \
|
||||||
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
|
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
|
||||||
|
@ -275,10 +277,32 @@ static void test_InternetExplorer(void)
|
||||||
ok(!ref, "object not destroyed, ref=%u\n", ref);
|
ok(!ref, "object not destroyed, ref=%u\n", ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_InternetExplorerManager(void)
|
||||||
|
{
|
||||||
|
IUnknown *unk;
|
||||||
|
ULONG ref;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
hres = CoCreateInstance(&CLSID_InternetExplorerManager, NULL, CLSCTX_LOCAL_SERVER,
|
||||||
|
&IID_IInternetExplorerManager, (void**)&unk);
|
||||||
|
ok(hres == S_OK || broken(hres == REGDB_E_CLASSNOTREG), "Could not create InternetExplorerManager instance: %08x\n", hres);
|
||||||
|
|
||||||
|
if(hres != S_OK)
|
||||||
|
{
|
||||||
|
win_skip("InternetExplorerManager not available\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref = IUnknown_Release(unk);
|
||||||
|
ok(!ref, "object not destroyed, ref=%u\n", ref);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(ie)
|
START_TEST(ie)
|
||||||
{
|
{
|
||||||
CoInitialize(NULL);
|
CoInitialize(NULL);
|
||||||
|
|
||||||
|
test_InternetExplorerManager();
|
||||||
|
|
||||||
test_InternetExplorer();
|
test_InternetExplorer();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
|
|
@ -22,6 +22,8 @@ HKCR,"CLSID\%CLSID_Internet%\Shell\OpenHomePage",,,"Open &Home Page"
|
||||||
HKCR,"CLSID\%CLSID_Internet%\Shell\OpenHomePage\Command",,,"""%16422%\Internet Explorer\iexplore.exe"""
|
HKCR,"CLSID\%CLSID_Internet%\Shell\OpenHomePage\Command",,,"""%16422%\Internet Explorer\iexplore.exe"""
|
||||||
HKCR,"CLSID\%CLSID_Internet%\ShellFolder",,2,"0x24"
|
HKCR,"CLSID\%CLSID_Internet%\ShellFolder",,2,"0x24"
|
||||||
|
|
||||||
|
HKCR,"CLSID\%CLSID_InternetExplorerManager%\LocalServer32",,,"""%16422%\Internet Explorer\iexplore.exe"" -startmanager"
|
||||||
|
|
||||||
|
|
||||||
[Settings.Reg]
|
[Settings.Reg]
|
||||||
HKCU,"Software\Microsoft\Internet Explorer\Main","Start Page",2,"http://www.winehq.org"
|
HKCU,"Software\Microsoft\Internet Explorer\Main","Start Page",2,"http://www.winehq.org"
|
||||||
|
@ -42,3 +44,4 @@ HKLM,"Software\Microsoft\Internet Explorer","W2kVersion",,"9.0.8112.16421"
|
||||||
[Strings]
|
[Strings]
|
||||||
CLSID_InternetExplorer="{0002df01-0000-0000-c000-000000000046}"
|
CLSID_InternetExplorer="{0002df01-0000-0000-c000-000000000046}"
|
||||||
CLSID_Internet="{871c5380-42a0-1069-a2ea-08002b30309d}"
|
CLSID_Internet="{871c5380-42a0-1069-a2ea-08002b30309d}"
|
||||||
|
CLSID_InternetExplorerManager="{df4fcc34-067a-4e0a-8352-4a1a5095346e}"
|
||||||
|
|
Loading…
Reference in a new issue