Commit 967561f8 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

shdocvw: Separate DocHost ref count from InternetExplorer ref count.

parent b0ba945e
...@@ -83,13 +83,13 @@ static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID ri ...@@ -83,13 +83,13 @@ static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID ri
static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface) static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
{ {
DocHost *This = impl_from_IOleClientSite(iface); DocHost *This = impl_from_IOleClientSite(iface);
return IDispatch_AddRef(This->disp); return This->container_vtbl->addref(This);
} }
static ULONG WINAPI ClientSite_Release(IOleClientSite *iface) static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
{ {
DocHost *This = impl_from_IOleClientSite(iface); DocHost *This = impl_from_IOleClientSite(iface);
return IDispatch_Release(This->disp); return This->container_vtbl->release(This);
} }
static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface) static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
......
...@@ -49,7 +49,7 @@ static HRESULT WINAPI InternetExplorer_QueryInterface(IWebBrowser2 *iface, REFII ...@@ -49,7 +49,7 @@ static HRESULT WINAPI InternetExplorer_QueryInterface(IWebBrowser2 *iface, REFII
*ppv = &This->IWebBrowser2_iface; *ppv = &This->IWebBrowser2_iface;
}else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) { }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
*ppv = &This->doc_host.cps.IConnectionPointContainer_iface; *ppv = &This->doc_host->doc_host.cps.IConnectionPointContainer_iface;
}else if(HlinkFrame_QI(&This->hlink_frame, riid, ppv)) { }else if(HlinkFrame_QI(&This->hlink_frame, riid, ppv)) {
return S_OK; return S_OK;
} }
...@@ -79,8 +79,17 @@ static ULONG WINAPI InternetExplorer_Release(IWebBrowser2 *iface) ...@@ -79,8 +79,17 @@ static ULONG WINAPI InternetExplorer_Release(IWebBrowser2 *iface)
TRACE("(%p) ref=%d\n", This, ref); TRACE("(%p) ref=%d\n", This, ref);
if(!ref) { if(!ref) {
DocHost_Release(&This->doc_host); if(This->doc_host) {
DocHost_Release(&This->doc_host->doc_host);
if(This->doc_host)
This->doc_host->ie = NULL;
}
if(This->frame_hwnd)
DestroyWindow(This->frame_hwnd);
heap_free(This); heap_free(This);
released_obj();
} }
return ref; return ref;
...@@ -140,7 +149,7 @@ static HRESULT WINAPI InternetExplorer_GoHome(IWebBrowser2 *iface) ...@@ -140,7 +149,7 @@ static HRESULT WINAPI InternetExplorer_GoHome(IWebBrowser2 *iface)
{ {
InternetExplorer *This = impl_from_IWebBrowser2(iface); InternetExplorer *This = impl_from_IWebBrowser2(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
return go_home(&This->doc_host); return go_home(&This->doc_host->doc_host);
} }
static HRESULT WINAPI InternetExplorer_GoSearch(IWebBrowser2 *iface) static HRESULT WINAPI InternetExplorer_GoSearch(IWebBrowser2 *iface)
...@@ -159,7 +168,7 @@ static HRESULT WINAPI InternetExplorer_Navigate(IWebBrowser2 *iface, BSTR szUrl, ...@@ -159,7 +168,7 @@ static HRESULT WINAPI InternetExplorer_Navigate(IWebBrowser2 *iface, BSTR szUrl,
TRACE("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(szUrl), Flags, TargetFrameName, TRACE("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(szUrl), Flags, TargetFrameName,
PostData, Headers); PostData, Headers);
return navigate_url(&This->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers); return navigate_url(&This->doc_host->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers);
} }
static HRESULT WINAPI InternetExplorer_Refresh(IWebBrowser2 *iface) static HRESULT WINAPI InternetExplorer_Refresh(IWebBrowser2 *iface)
...@@ -294,7 +303,7 @@ static HRESULT WINAPI InternetExplorer_get_LocationURL(IWebBrowser2 *iface, BSTR ...@@ -294,7 +303,7 @@ static HRESULT WINAPI InternetExplorer_get_LocationURL(IWebBrowser2 *iface, BSTR
TRACE("(%p)->(%p)\n", This, LocationURL); TRACE("(%p)->(%p)\n", This, LocationURL);
return get_location_url(&This->doc_host, LocationURL); return get_location_url(&This->doc_host->doc_host, LocationURL);
} }
static HRESULT WINAPI InternetExplorer_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool) static HRESULT WINAPI InternetExplorer_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
...@@ -473,7 +482,7 @@ static HRESULT WINAPI InternetExplorer_Navigate2(IWebBrowser2 *iface, VARIANT *U ...@@ -473,7 +482,7 @@ static HRESULT WINAPI InternetExplorer_Navigate2(IWebBrowser2 *iface, VARIANT *U
return E_INVALIDARG; return E_INVALIDARG;
} }
return navigate_url(&This->doc_host, V_BSTR(URL), Flags, TargetFrameName, PostData, Headers); return navigate_url(&This->doc_host->doc_host, V_BSTR(URL), Flags, TargetFrameName, PostData, Headers);
} }
static HRESULT WINAPI InternetExplorer_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf) static HRESULT WINAPI InternetExplorer_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
......
...@@ -50,6 +50,8 @@ static const WCHAR szIEWinFrame[] = { 'I','E','F','r','a','m','e',0 }; ...@@ -50,6 +50,8 @@ static const WCHAR szIEWinFrame[] = { 'I','E','F','r','a','m','e',0 };
static const WCHAR wszWineInternetExplorer[] = static const WCHAR wszWineInternetExplorer[] =
{'W','i','n','e',' ','I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',0}; {'W','i','n','e',' ','I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',0};
static LONG obj_cnt;
HRESULT update_ie_statustext(InternetExplorer* This, LPCWSTR text) HRESULT update_ie_statustext(InternetExplorer* This, LPCWSTR text)
{ {
if(!SendMessageW(This->status_hwnd, SB_SETTEXTW, MAKEWORD(SB_SIMPLEID, 0), (LPARAM)text)) if(!SendMessageW(This->status_hwnd, SB_SETTEXTW, MAKEWORD(SB_SIMPLEID, 0), (LPARAM)text))
...@@ -505,8 +507,8 @@ static LRESULT iewnd_OnSize(InternetExplorer *This, INT width, INT height) ...@@ -505,8 +507,8 @@ static LRESULT iewnd_OnSize(InternetExplorer *This, INT width, INT height)
adjust_ie_docobj_rect(This->frame_hwnd, &docarea); adjust_ie_docobj_rect(This->frame_hwnd, &docarea);
if(This->doc_host.hwnd) if(This->doc_host->doc_host.hwnd)
SetWindowPos(This->doc_host.hwnd, NULL, docarea.left, docarea.top, docarea.right, docarea.bottom, SetWindowPos(This->doc_host->doc_host.hwnd, NULL, docarea.left, docarea.top, docarea.right, docarea.bottom,
SWP_NOZORDER | SWP_NOACTIVATE); SWP_NOZORDER | SWP_NOACTIVATE);
SetWindowPos(hwndRebar, NULL, 0, 0, width, barHeight, SWP_NOZORDER | SWP_NOACTIVATE); SetWindowPos(hwndRebar, NULL, 0, 0, width, barHeight, SWP_NOZORDER | SWP_NOACTIVATE);
...@@ -551,7 +553,6 @@ static LRESULT iewnd_OnDestroy(InternetExplorer *This) ...@@ -551,7 +553,6 @@ static LRESULT iewnd_OnDestroy(InternetExplorer *This)
free_fav_menu_data(get_fav_menu(This->menu)); free_fav_menu_data(get_fav_menu(This->menu));
ImageList_Destroy(list); ImageList_Destroy(list);
This->frame_hwnd = NULL; This->frame_hwnd = NULL;
PostQuitMessage(0); /* FIXME */
return 0; return 0;
} }
...@@ -565,11 +566,11 @@ static LRESULT iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT msg, WPAR ...@@ -565,11 +566,11 @@ static LRESULT iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT msg, WPAR
break; break;
case ID_BROWSE_PRINT: case ID_BROWSE_PRINT:
if(This->doc_host.document) if(This->doc_host->doc_host.document)
{ {
IOleCommandTarget* target; IOleCommandTarget* target;
if(FAILED(IUnknown_QueryInterface(This->doc_host.document, &IID_IOleCommandTarget, (LPVOID*)&target))) if(FAILED(IUnknown_QueryInterface(This->doc_host->doc_host.document, &IID_IOleCommandTarget, (LPVOID*)&target)))
break; break;
IOleCommandTarget_Exec(target, &CGID_MSHTML, IDM_PRINT, OLECMDEXECOPT_DODEFAULT, NULL, NULL); IOleCommandTarget_Exec(target, &CGID_MSHTML, IDM_PRINT, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
...@@ -587,7 +588,7 @@ static LRESULT iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT msg, WPAR ...@@ -587,7 +588,7 @@ static LRESULT iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT msg, WPAR
break; break;
case ID_BROWSE_QUIT: case ID_BROWSE_QUIT:
iewnd_OnDestroy(This); ShowWindow(hwnd, SW_HIDE);
break; break;
default: default:
...@@ -624,6 +625,17 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) ...@@ -624,6 +625,17 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{ {
case WM_CREATE: case WM_CREATE:
return iewnd_OnCreate(hwnd, (LPCREATESTRUCTW)lparam); return iewnd_OnCreate(hwnd, (LPCREATESTRUCTW)lparam);
case WM_CLOSE:
TRACE("WM_CLOSE\n");
ShowWindow(hwnd, SW_HIDE);
return 0;
case WM_SHOWWINDOW:
TRACE("WM_SHOWWINDOW %lx\n", wparam);
if(wparam)
IWebBrowser2_AddRef(&This->IWebBrowser2_iface);
else
IWebBrowser2_Release(&This->IWebBrowser2_iface);
break;
case WM_DESTROY: case WM_DESTROY:
return iewnd_OnDestroy(This); return iewnd_OnDestroy(This);
case WM_SIZE: case WM_SIZE:
...@@ -633,7 +645,7 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) ...@@ -633,7 +645,7 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
case WM_NOTIFY: case WM_NOTIFY:
return iewnd_OnNotify(This, wparam, lparam); return iewnd_OnNotify(This, wparam, lparam);
case WM_DOCHOSTTASK: case WM_DOCHOSTTASK:
return process_dochost_task(&This->doc_host, lparam); return process_dochost_task(&This->doc_host->doc_host, lparam);
case WM_UPDATEADDRBAR: case WM_UPDATEADDRBAR:
return update_addrbar(This, lparam); return update_addrbar(This, lparam);
} }
...@@ -678,13 +690,13 @@ static void create_frame_hwnd(InternetExplorer *This) ...@@ -678,13 +690,13 @@ static void create_frame_hwnd(InternetExplorer *This)
NULL, NULL /* FIXME */, shdocvw_hinstance, This); NULL, NULL /* FIXME */, shdocvw_hinstance, This);
} }
static IWebBrowser2 *create_ie_window(LPCSTR cmdline) static BOOL create_ie_window(LPCSTR cmdline)
{ {
IWebBrowser2 *wb = NULL; IWebBrowser2 *wb = NULL;
InternetExplorer_Create(NULL, &IID_IWebBrowser2, (void**)&wb); InternetExplorer_Create(NULL, &IID_IWebBrowser2, (void**)&wb);
if(!wb) if(!wb)
return NULL; return FALSE;
IWebBrowser2_put_Visible(wb, VARIANT_TRUE); IWebBrowser2_put_Visible(wb, VARIANT_TRUE);
IWebBrowser2_put_MenuBar(wb, VARIANT_TRUE); IWebBrowser2_put_MenuBar(wb, VARIANT_TRUE);
...@@ -718,12 +730,39 @@ static IWebBrowser2 *create_ie_window(LPCSTR cmdline) ...@@ -718,12 +730,39 @@ static IWebBrowser2 *create_ie_window(LPCSTR cmdline)
SysFreeString(V_BSTR(&var_url)); SysFreeString(V_BSTR(&var_url));
} }
return wb; IWebBrowser2_Release(wb);
return TRUE;
}
static inline IEDocHost *impl_from_DocHost(DocHost *iface)
{
return CONTAINING_RECORD(iface, IEDocHost, doc_host);
}
static ULONG IEDocHost_addref(DocHost *iface)
{
IEDocHost *This = impl_from_DocHost(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
} }
static inline InternetExplorer *impl_from_DocHost(DocHost *iface) static ULONG IEDocHost_release(DocHost *iface)
{ {
return CONTAINING_RECORD(iface, InternetExplorer, doc_host); IEDocHost *This = impl_from_DocHost(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
if(This->ie)
This->ie->doc_host = NULL;
heap_free(This);
}
return ref;
} }
static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc) static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc)
...@@ -732,10 +771,10 @@ static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc) ...@@ -732,10 +771,10 @@ static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc)
adjust_ie_docobj_rect(This->frame_hwnd, rc); adjust_ie_docobj_rect(This->frame_hwnd, rc);
} }
static HRESULT WINAPI DocHostContainer_SetStatusText(DocHost* This, LPCWSTR text) static HRESULT WINAPI DocHostContainer_SetStatusText(DocHost *iface, LPCWSTR text)
{ {
InternetExplorer* ie = impl_from_DocHost(This); IEDocHost *This = impl_from_DocHost(iface);
return update_ie_statustext(ie, text); return update_ie_statustext(This->ie, text);
} }
static void WINAPI DocHostContainer_SetURL(DocHost* This, LPCWSTR url) static void WINAPI DocHostContainer_SetURL(DocHost* This, LPCWSTR url)
...@@ -749,6 +788,8 @@ static HRESULT DocHostContainer_exec(DocHost* This, const GUID *cmd_group, DWORD ...@@ -749,6 +788,8 @@ static HRESULT DocHostContainer_exec(DocHost* This, const GUID *cmd_group, DWORD
return S_OK; return S_OK;
} }
static const IDocHostContainerVtbl DocHostContainerVtbl = { static const IDocHostContainerVtbl DocHostContainerVtbl = {
IEDocHost_addref,
IEDocHost_release,
DocHostContainer_GetDocObjRect, DocHostContainer_GetDocObjRect,
DocHostContainer_SetStatusText, DocHostContainer_SetStatusText,
DocHostContainer_SetURL, DocHostContainer_SetURL,
...@@ -763,25 +804,40 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv) ...@@ -763,25 +804,40 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv)
TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv); TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
ret = heap_alloc_zero(sizeof(InternetExplorer)); ret = heap_alloc_zero(sizeof(InternetExplorer));
ret->ref = 0; if(!ret)
return E_OUTOFMEMORY;
ret->doc_host.disp = (IDispatch*)&ret->IWebBrowser2_iface; ret->doc_host = heap_alloc_zero(sizeof(IEDocHost));
DocHost_Init(&ret->doc_host, (IDispatch*)&ret->IWebBrowser2_iface, &DocHostContainerVtbl); if(!ret->doc_host) {
heap_free(ret);
return E_OUTOFMEMORY;
}
ret->ref = 1;
ret->doc_host->ie = ret;
DocHost_Init(&ret->doc_host->doc_host, (IDispatch*)&ret->IWebBrowser2_iface, &DocHostContainerVtbl);
InternetExplorer_WebBrowser_Init(ret); InternetExplorer_WebBrowser_Init(ret);
HlinkFrame_Init(&ret->hlink_frame, (IUnknown*)&ret->IWebBrowser2_iface, &ret->doc_host); HlinkFrame_Init(&ret->hlink_frame, (IUnknown*)&ret->IWebBrowser2_iface, &ret->doc_host->doc_host);
create_frame_hwnd(ret); create_frame_hwnd(ret);
ret->doc_host.frame_hwnd = ret->frame_hwnd; ret->doc_host->doc_host.frame_hwnd = ret->frame_hwnd;
hres = IWebBrowser2_QueryInterface(&ret->IWebBrowser2_iface, riid, ppv); hres = IWebBrowser2_QueryInterface(&ret->IWebBrowser2_iface, riid, ppv);
if(FAILED(hres)) { IWebBrowser2_Release(&ret->IWebBrowser2_iface);
heap_free(ret); if(FAILED(hres))
return hres; return hres;
}
return hres; InterlockedIncrement(&obj_cnt);
return S_OK;
}
void released_obj(void)
{
if(!InterlockedDecrement(&obj_cnt))
PostQuitMessage(0);
} }
/****************************************************************** /******************************************************************
...@@ -791,7 +847,6 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv) ...@@ -791,7 +847,6 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv)
*/ */
DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow) DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
{ {
IWebBrowser2 *wb = NULL;
MSG msg; MSG msg;
HRESULT hres; HRESULT hres;
...@@ -812,8 +867,12 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow) ...@@ -812,8 +867,12 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
ExitProcess(1); ExitProcess(1);
} }
if(strcasecmp(szCommandLine, "-embedding")) if(strcasecmp(szCommandLine, "-embedding")) {
wb = create_ie_window(szCommandLine); if(!create_ie_window(szCommandLine)) {
CoUninitialize();
ExitProcess(1);
}
}
/* run the message loop for this thread */ /* run the message loop for this thread */
while (GetMessageW(&msg, 0, 0, 0)) while (GetMessageW(&msg, 0, 0, 0))
...@@ -822,9 +881,6 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow) ...@@ -822,9 +881,6 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
DispatchMessageW(&msg); DispatchMessageW(&msg);
} }
if(wb)
IWebBrowser2_Release(wb);
register_class_object(FALSE); register_class_object(FALSE);
CoUninitialize(); CoUninitialize();
......
...@@ -86,6 +86,8 @@ typedef struct _task_header_t { ...@@ -86,6 +86,8 @@ typedef struct _task_header_t {
typedef struct _IDocHostContainerVtbl typedef struct _IDocHostContainerVtbl
{ {
ULONG (*addref)(DocHost*);
ULONG (*release)(DocHost*);
void (WINAPI* GetDocObjRect)(DocHost*,RECT*); void (WINAPI* GetDocObjRect)(DocHost*,RECT*);
HRESULT (WINAPI* SetStatusText)(DocHost*,LPCWSTR); HRESULT (WINAPI* SetStatusText)(DocHost*,LPCWSTR);
void (WINAPI* SetURL)(DocHost*,LPCWSTR); void (WINAPI* SetURL)(DocHost*,LPCWSTR);
...@@ -182,6 +184,14 @@ struct WebBrowser { ...@@ -182,6 +184,14 @@ struct WebBrowser {
DocHost doc_host; DocHost doc_host;
}; };
typedef struct {
DocHost doc_host;
LONG ref;
InternetExplorer *ie;
} IEDocHost;
struct InternetExplorer { struct InternetExplorer {
IWebBrowser2 IWebBrowser2_iface; IWebBrowser2 IWebBrowser2_iface;
HlinkFrame hlink_frame; HlinkFrame hlink_frame;
...@@ -192,7 +202,7 @@ struct InternetExplorer { ...@@ -192,7 +202,7 @@ struct InternetExplorer {
HWND status_hwnd; HWND status_hwnd;
HMENU menu; HMENU menu;
DocHost doc_host; IEDocHost *doc_host;
}; };
void WebBrowser_OleObject_Init(WebBrowser*); void WebBrowser_OleObject_Init(WebBrowser*);
...@@ -235,6 +245,8 @@ LRESULT process_dochost_task(DocHost*,LPARAM); ...@@ -235,6 +245,8 @@ LRESULT process_dochost_task(DocHost*,LPARAM);
HRESULT InternetExplorer_Create(IUnknown*,REFIID,void**); HRESULT InternetExplorer_Create(IUnknown*,REFIID,void**);
void InternetExplorer_WebBrowser_Init(InternetExplorer*); void InternetExplorer_WebBrowser_Init(InternetExplorer*);
void released_obj(void);
HRESULT CUrlHistory_Create(IUnknown*,REFIID,void**); HRESULT CUrlHistory_Create(IUnknown*,REFIID,void**);
HRESULT InternetShortcut_Create(IUnknown*,REFIID,void**); HRESULT InternetShortcut_Create(IUnknown*,REFIID,void**);
......
...@@ -1110,6 +1110,18 @@ static inline WebBrowser *impl_from_DocHost(DocHost *iface) ...@@ -1110,6 +1110,18 @@ static inline WebBrowser *impl_from_DocHost(DocHost *iface)
return CONTAINING_RECORD(iface, WebBrowser, doc_host); return CONTAINING_RECORD(iface, WebBrowser, doc_host);
} }
static ULONG WebBrowser_addref(DocHost *iface)
{
WebBrowser *This = impl_from_DocHost(iface);
return IWebBrowser2_AddRef(&This->IWebBrowser2_iface);
}
static ULONG WebBrowser_release(DocHost *iface)
{
WebBrowser *This = impl_from_DocHost(iface);
return IWebBrowser2_Release(&This->IWebBrowser2_iface);
}
static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc) static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc)
{ {
GetClientRect(This->frame_hwnd, rc); GetClientRect(This->frame_hwnd, rc);
...@@ -1156,6 +1168,8 @@ static HRESULT DocHostContainer_exec(DocHost *doc_host, const GUID *cmd_group, D ...@@ -1156,6 +1168,8 @@ static HRESULT DocHostContainer_exec(DocHost *doc_host, const GUID *cmd_group, D
} }
static const IDocHostContainerVtbl DocHostContainerVtbl = { static const IDocHostContainerVtbl DocHostContainerVtbl = {
WebBrowser_addref,
WebBrowser_release,
DocHostContainer_GetDocObjRect, DocHostContainer_GetDocObjRect,
DocHostContainer_SetStatusText, DocHostContainer_SetStatusText,
DocHostContainer_SetURL, DocHostContainer_SetURL,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment