[IEFRAME] Sync with Wine 3.0. CORE-14225

This commit is contained in:
Amine Khaldi 2018-01-19 00:36:36 +01:00
parent e399d3ec3e
commit c4b0f2155f
6 changed files with 165 additions and 50 deletions

View file

@ -329,13 +329,16 @@ TID_LIST
} tid_t;
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 InternetExplorer_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 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 HINSTANCE ieframe_instance DECLSPEC_HIDDEN;

View file

@ -42,6 +42,13 @@ HKCR
Control
}
}
NoRemove Interface
{
'{acc84351-04ff-44f9-b23f-655ed168c6d5}'
{
ProxyStubClsid32 = s '{a4a1a128-768f-41e0-bf75-e4fddd701cba}'
}
}
'InternetShortcut'
{
val 'EditFlags' = s '2'

View file

@ -232,32 +232,17 @@ static const IClassFactoryVtbl InternetExplorerFactoryVtbl = {
ClassFactory_LockServer
};
static IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
HRESULT register_class_object(BOOL do_reg)
{
HRESULT hres;
static const IClassFactoryVtbl InternetExplorerManagerFactoryVtbl = {
ClassFactory_QueryInterface,
ClassFactory_AddRef,
ClassFactory_Release,
InternetExplorerManager_Create,
ClassFactory_LockServer
};
static DWORD cookie;
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);
}
IClassFactory InternetExplorerManagerFactory = { &InternetExplorerManagerFactoryVtbl };
/***********************************************************************
* DllCanUnloadNow (ieframe.@)

View file

@ -24,6 +24,9 @@
#include <mshtmcid.h>
#include <ddeml.h>
#include <initguid.h>
#include <ieautomation.h>
#define IDI_APPICON 1
#define WM_UPDATEADDRBAR (WM_APP+1)
@ -832,13 +835,99 @@ HRESULT WINAPI InternetExplorer_Create(IClassFactory *iface, IUnknown *pOuter, R
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)
{
if(!InterlockedDecrement(&obj_cnt))
PostQuitMessage(0);
}
static BOOL create_ie_window(const WCHAR *cmdline)
static BOOL create_ie_window(BOOL nohome, const WCHAR *cmdline)
{
InternetExplorer *ie;
HRESULT hres;
@ -851,33 +940,27 @@ static BOOL create_ie_window(const WCHAR *cmdline)
IWebBrowser2_put_MenuBar(&ie->IWebBrowser2_iface, VARIANT_TRUE);
if(!*cmdline) {
IWebBrowser2_GoHome(&ie->IWebBrowser2_iface);
if (nohome)
ie->nohome = TRUE;
else
IWebBrowser2_GoHome(&ie->IWebBrowser2_iface);
}else {
VARIANT var_url;
int cmdlen;
static const WCHAR nohomeW[] = {'-','n','o','h','o','m','e'};
while(*cmdline == ' ' || *cmdline == '\t')
cmdline++;
cmdlen = strlenW(cmdline);
if(cmdlen > 2 && cmdline[0] == '"' && cmdline[cmdlen-1] == '"') {
cmdline++;
cmdlen -= 2;
}
if(cmdlen == sizeof(nohomeW)/sizeof(*nohomeW) && !memcmp(cmdline, nohomeW, sizeof(nohomeW))) {
ie->nohome = TRUE;
}else {
V_VT(&var_url) = VT_BSTR;
V_VT(&var_url) = VT_BSTR;
V_BSTR(&var_url) = SysAllocStringLen(cmdline, cmdlen);
V_BSTR(&var_url) = SysAllocStringLen(cmdline, cmdlen);
/* navigate to the first page */
IWebBrowser2_Navigate2(&ie->IWebBrowser2_iface, &var_url, NULL, NULL, NULL, NULL);
/* navigate to the first page */
IWebBrowser2_Navigate2(&ie->IWebBrowser2_iface, &var_url, NULL, NULL, NULL, NULL);
SysFreeString(V_BSTR(&var_url));
}
SysFreeString(V_BSTR(&var_url));
}
IWebBrowser2_Release(&ie->IWebBrowser2_iface);
@ -1035,23 +1118,60 @@ DWORD WINAPI IEWinMain(const WCHAR *cmdline, int nShowWindow)
{
MSG msg;
HRESULT hres;
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 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);
CoInitialize(NULL);
hres = register_class_object(TRUE);
if(FAILED(hres)) {
init_dde();
while (*cmdline)
{
int length = 0;
while (*cmdline == ' ' || *cmdline == '\t') cmdline++;
if (!*cmdline) break;
while (cmdline[length] && cmdline[length] != ' ' && cmdline[length] != '\t') length++;
if (!strncmpiW(cmdline, embeddingW, length))
embedding = TRUE;
else if (!strncmpiW(cmdline, nohomeW, length))
nohome = TRUE;
else if (!strncmpiW(cmdline, startmanagerW, length))
manager = TRUE;
else
break;
cmdline += length;
}
if (manager)
hres = CoRegisterClassObject(&CLSID_InternetExplorerManager,
(IUnknown*)&InternetExplorerManagerFactory, CLSCTX_SERVER,
REGCLS_SINGLEUSE, &reg_cookie);
else
hres = CoRegisterClassObject(&CLSID_InternetExplorer,
(IUnknown*)&InternetExplorerFactory, CLSCTX_SERVER,
REGCLS_MULTIPLEUSE, &reg_cookie);
if (FAILED(hres))
{
ERR("failed to register CLSID_InternetExplorer%s: %08x\n", manager ? "Manager" : "", hres);
CoUninitialize();
ExitProcess(1);
}
init_dde();
if(strcmpiW(cmdline, embeddingW)) {
if(!create_ie_window(cmdline)) {
if (!embedding)
{
if(!create_ie_window(nohome, cmdline))
{
CoUninitialize();
ExitProcess(1);
}
@ -1064,7 +1184,7 @@ DWORD WINAPI IEWinMain(const WCHAR *cmdline, int nShowWindow)
DispatchMessageW(&msg);
}
register_class_object(FALSE);
CoRevokeClassObject(reg_cookie);
release_dde();
CoUninitialize();

View file

@ -56,7 +56,7 @@ static HRESULT WINAPI ViewObject_Draw(IViewObject2 *iface, DWORD dwDrawAspect,
FIXME("(%p)->(%d %d %p %p %p %p %p %p %p %08lx)\n", This, dwDrawAspect, lindex,
pvAspect, ptd, hdcTargetDev, hdcDraw, lprcBounds, lprcWBounds, pfnContinue,
dwContinue);
return S_OK;
return E_NOTIMPL;
}
static HRESULT WINAPI ViewObject_GetColorSet(IViewObject2 *iface, DWORD dwAspect,

View file

@ -74,7 +74,7 @@ reactos/dll/win32/hlink # Synced to Wine-3.0
reactos/dll/win32/hnetcfg # Synced to Wine-3.0
reactos/dll/win32/httpapi # Synced to WineStaging-2.9
reactos/dll/win32/iccvid # Synced to Wine-3.0
reactos/dll/win32/ieframe # Synced to WineStaging-2.9
reactos/dll/win32/ieframe # Synced to Wine-3.0
reactos/dll/win32/imaadp32.acm # Synced to WineStaging-2.16
reactos/dll/win32/imagehlp # Synced to WineStaging-2.9
reactos/dll/win32/imm32 # Synced to Wine-2.22