On 10.08.2017 20:52, Zebediah Figura wrote:
v2: register IE and IEM separately, and the latter with SINGLEUSE (thanks Jacek)
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
dlls/ieframe/ieframe.h | 5 +- dlls/ieframe/ieframe_main.c | 35 ++++--------- dlls/ieframe/iexplore.c | 111 ++++++++++++++++++++++++++++++++++++++--- dlls/ieframe/tests/ie.c | 21 ++++++++ programs/iexplore/iexplore.inf | 3 ++ 5 files changed, 142 insertions(+), 33 deletions(-)
diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h index d1f1c5daf24..c690d5c6878 100644 --- a/dlls/ieframe/ieframe.h +++ b/dlls/ieframe/ieframe.h @@ -312,13 +312,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; +extern IClassFactory InternetExplorerManagerFactory;
This is missing DECLSPEC_HIDDEN.
+/******************************************************************
IInternetExplorerManager implementation
- */
+struct internet_explorer_manager {
- IInternetExplorerManager IInternetExplorerManager_iface;
- LONG ref;
+};
Please use the type from public declaration (coclass). See how InternetExplorer object is declared.
+HRESULT WINAPI InternetExplorerManager_Create(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppv) +{
- struct internet_explorer_manager *ret;
- 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;
- return IInternetExplorerManager_QueryInterface(&ret->IInternetExplorerManager_iface, riid, ppv);
+}
This leaks the object if QueryInterface fails. The usual way to handle is to set initial ref to 1 and release the object after QI() call.
+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 || hres == REGDB_E_CLASSNOTREG, "Could not create InternetExplorerManager instance: %08x\n", hres);
Use broken() for failure with older versions.
- if(hres != S_OK)
return;
This could use a win_skip().
Thanks, Jacek