static HRESULT WINAPI WBPCI_QueryInterface(LPPROVIDECLASSINFO iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IProvideClassInfoImpl *This = (IProvideClassInfoImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
+\r
+ if (ppobj == NULL) return E_POINTER;\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBPCI_AddRef(LPPROVIDECLASSINFO iface)\r
{\r
- IProvideClassInfoImpl *This = (IProvideClassInfoImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBPCI_Release(LPPROVIDECLASSINFO iface)\r
{\r
- IProvideClassInfoImpl *This = (IProvideClassInfoImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/* Return an ITypeInfo interface to retrieve type library info about\r
WBPCI_GetClassInfo\r
};\r
\r
-IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl, 1 };\r
+IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl};\r
\r
\r
/**********************************************************************\r
static HRESULT WINAPI WBPCI2_QueryInterface(LPPROVIDECLASSINFO2 iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IProvideClassInfo2Impl *This = (IProvideClassInfo2Impl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBPCI2_AddRef(LPPROVIDECLASSINFO2 iface)\r
{\r
- IProvideClassInfo2Impl *This = (IProvideClassInfo2Impl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBPCI2_Release(LPPROVIDECLASSINFO2 iface)\r
{\r
- IProvideClassInfo2Impl *This = (IProvideClassInfo2Impl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/* Return an ITypeInfo interface to retrieve type library info about\r
WBPCI2_GetGUID\r
};\r
\r
-IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2 = { &WBPCI2_Vtbl, 1 };\r
+IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2 = { &WBPCI2_Vtbl};\r
static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IConnectionPointContainerImpl *This = (IConnectionPointContainerImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface)\r
{\r
- IConnectionPointContainerImpl *This = (IConnectionPointContainerImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface)\r
{\r
- IConnectionPointContainerImpl *This = (IConnectionPointContainerImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/* Get a list of connection points inside this container. */\r
WBCPC_FindConnectionPoint\r
};\r
\r
-IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = { &WBCPC_Vtbl, 1 };\r
+IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = {&WBCPC_Vtbl};\r
\r
\r
/**********************************************************************\r
static HRESULT WINAPI WBCP_QueryInterface(LPCONNECTIONPOINT iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IConnectionPointImpl *This = (IConnectionPointImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBCP_AddRef(LPCONNECTIONPOINT iface)\r
{\r
- IConnectionPointImpl *This = (IConnectionPointImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBCP_Release(LPCONNECTIONPOINT iface)\r
{\r
- IConnectionPointImpl *This = (IConnectionPointImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
static HRESULT WINAPI WBCP_GetConnectionInterface(LPCONNECTIONPOINT iface, IID* pIId)\r
WBCP_EnumConnections\r
};\r
\r
-IConnectionPointImpl SHDOCVW_ConnectionPoint = { &WBCP_Vtbl, 1 };\r
+IConnectionPointImpl SHDOCVW_ConnectionPoint = {&WBCP_Vtbl};\r
static HRESULT WINAPI WBCF_QueryInterface(LPCLASSFACTORY iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
-\r
- TRACE ("\n");\r
-\r
- /*\r
- * Perform a sanity check on the parameters.\r
- */\r
- if ((This == NULL) || (ppobj == NULL) )\r
- return E_INVALIDARG;\r
-\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
+ \r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
*/\r
static ULONG WINAPI WBCF_AddRef(LPCLASSFACTORY iface)\r
{\r
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
/************************************************************************\r
*/\r
static ULONG WINAPI WBCF_Release(LPCLASSFACTORY iface)\r
{\r
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/************************************************************************\r
*/\r
static HRESULT WINAPI WBCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)\r
{\r
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
- FIXME("(%p)->(%d),stub!\n", This, dolock);\r
+ TRACE("(%d)\n", dolock);\r
+\r
+ if (dolock)\r
+ SHDOCVW_LockModule();\r
+ else\r
+ SHDOCVW_UnlockModule();\r
+ \r
return S_OK;\r
}\r
\r
WBCF_LockServer\r
};\r
\r
-IClassFactoryImpl SHDOCVW_ClassFactory = { &WBCF_Vtbl, 1 };\r
+IClassFactoryImpl SHDOCVW_ClassFactory = {&WBCF_Vtbl};\r
static HRESULT WINAPI WBQA_QueryInterface(LPQUICKACTIVATE iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IQuickActivateImpl *This = (IQuickActivateImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBQA_AddRef(LPQUICKACTIVATE iface)\r
{\r
- IQuickActivateImpl *This = (IQuickActivateImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBQA_Release(LPQUICKACTIVATE iface)\r
{\r
- IQuickActivateImpl *This = (IQuickActivateImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/* Alternative interface for quicker, easier activation of a control. */\r
WBQA_GetContentExtent\r
};\r
\r
-IQuickActivateImpl SHDOCVW_QuickActivate = { &WBQA_Vtbl, 1 };\r
+IQuickActivateImpl SHDOCVW_QuickActivate = {&WBQA_Vtbl};\r
+\r
+/**********************************************************************\r
+ * OpenURL (SHDOCVW.@)\r
+ */\r
+void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd)\r
+{\r
+ FIXME("%p %p %s %d\n", hWnd, hInst, debugstr_a(lpcstrUrl), nShowCmd);\r
+}\r
*/\r
static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)\r
{\r
- IOleObjectImpl *This = (IOleObjectImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
/************************************************************************\r
*/\r
static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)\r
{\r
- IOleObjectImpl *This = (IOleObjectImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/************************************************************************\r
WBOOBJ_SetColorScheme\r
};\r
\r
-IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };\r
+IOleObjectImpl SHDOCVW_OleObject = {&WBOOBJ_Vtbl};\r
\r
\r
/**********************************************************************\r
static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IOleInPlaceObjectImpl *This = (IOleInPlaceObjectImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)\r
{\r
- IOleInPlaceObjectImpl *This = (IOleInPlaceObjectImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)\r
{\r
- IOleInPlaceObjectImpl *This = (IOleInPlaceObjectImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)\r
WBOIPO_ReactivateAndUndo\r
};\r
\r
-IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };\r
+IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = {&WBOIPO_Vtbl};\r
\r
\r
/**********************************************************************\r
static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IOleControlImpl *This = (IOleControlImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)\r
{\r
- IOleControlImpl *This = (IOleControlImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)\r
{\r
- IOleControlImpl *This = (IOleControlImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)\r
WBOC_FreezeEvents\r
};\r
\r
-IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };\r
+IOleControlImpl SHDOCVW_OleControl = {&WBOC_Vtbl};\r
static HRESULT WINAPI WBPS_QueryInterface(LPPERSISTSTORAGE iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IPersistStorageImpl *This = (IPersistStorageImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBPS_AddRef(LPPERSISTSTORAGE iface)\r
{\r
- IPersistStorageImpl *This = (IPersistStorageImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBPS_Release(LPPERSISTSTORAGE iface)\r
{\r
- IPersistStorageImpl *This = (IPersistStorageImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
static HRESULT WINAPI WBPS_GetClassID(LPPERSISTSTORAGE iface, CLSID *pClassID)\r
WBPS_SaveCompleted\r
};\r
\r
-IPersistStorageImpl SHDOCVW_PersistStorage = { &WBPS_Vtbl, 1 };\r
+IPersistStorageImpl SHDOCVW_PersistStorage = {&WBPS_Vtbl};\r
\r
\r
/**********************************************************************\r
static HRESULT WINAPI WBPSI_QueryInterface(LPPERSISTSTREAMINIT iface,\r
REFIID riid, LPVOID *ppobj)\r
{\r
- IPersistStreamInitImpl *This = (IPersistStreamInitImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WBPSI_AddRef(LPPERSISTSTREAMINIT iface)\r
{\r
- IPersistStreamInitImpl *This = (IPersistStreamInitImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WBPSI_Release(LPPERSISTSTREAMINIT iface)\r
{\r
- IPersistStreamInitImpl *This = (IPersistStreamInitImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
static HRESULT WINAPI WBPSI_GetClassID(LPPERSISTSTREAMINIT iface, CLSID *pClassID)\r
WBPSI_InitNew\r
};\r
\r
-IPersistStreamInitImpl SHDOCVW_PersistStreamInit = { &WBPSI_Vtbl, 1 };\r
+IPersistStreamInitImpl SHDOCVW_PersistStreamInit = {&WBPSI_Vtbl};\r
\r
extern IConnectionPointImpl SHDOCVW_ConnectionPoint;\r
\r
+/**********************************************************************\r
+ * Dll lifetime tracking declaration for shdocvw.dll\r
+ */\r
+extern LONG SHDOCVW_refCount;\r
+static inline void SHDOCVW_LockModule() { InterlockedIncrement( &SHDOCVW_refCount ); }\r
+static inline void SHDOCVW_UnlockModule() { InterlockedDecrement( &SHDOCVW_refCount ); }\r
+\r
#endif /* __WINE_SHDOCVW_H */\r
@ stub ImportPrivacySettings\r
@ stub InstallReg_RunDLL\r
@ stub IEWriteErrorLog\r
-@ stub OpenURL\r
+@ stdcall OpenURL(long long str long)\r
@ stub SHGetIDispatchForFolder\r
@ stdcall SetQueryNetSessionCount(long)\r
@ stub SoftwareUpdateMessageBox\r
\r
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);\r
\r
+LONG SHDOCVW_refCount = 0;\r
+\r
static const WCHAR szMozDlPath[] = {\r
'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',\r
's','h','d','o','c','v','w',0\r
DEFINE_GUID( CLSID_MozillaBrowser, 0x1339B54C,0x3453,0x11D2,0x93,0xB9,0x00,0x00,0x00,0x00,0x00,0x00);\r
\r
typedef HRESULT (WINAPI *fnGetClassObject)(REFCLSID rclsid, REFIID iid, LPVOID *ppv);\r
+typedef HRESULT (WINAPI *fnCanUnloadNow)(void);\r
\r
HINSTANCE shdocvw_hinstance = 0;\r
static HMODULE SHDOCVW_hshell32 = 0;\r
*/\r
HRESULT WINAPI SHDOCVW_DllCanUnloadNow(void)\r
{\r
- FIXME("(void): stub\n");\r
+ HRESULT moz_can_unload = S_FALSE;\r
+ fnCanUnloadNow pCanUnloadNow;\r
+\r
+ if (hMozCtl)\r
+ {\r
+ pCanUnloadNow = (fnCanUnloadNow)\r
+ GetProcAddress(hMozCtl, "DllCanUnloadNow");\r
+ moz_can_unload = pCanUnloadNow();\r
+ }\r
+ else\r
+ moz_can_unload = S_OK;\r
+\r
+ if (moz_can_unload == S_OK && SHDOCVW_refCount == 0)\r
+ return S_OK;\r
\r
return S_FALSE;\r
}\r
static HRESULT WINAPI\r
dlQueryInterface( IBindStatusCallback* This, REFIID riid, void** ppvObject )\r
{\r
+ if (ppvObject == NULL) return E_POINTER;\r
+ \r
if( IsEqualIID(riid, &IID_IUnknown) ||\r
IsEqualIID(riid, &IID_IBindStatusCallback))\r
{\r
static ULONG WINAPI dlAddRef( IBindStatusCallback* iface )\r
{\r
IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;\r
+\r
+ SHDOCVW_LockModule();\r
+ \r
return InterlockedIncrement( &This->ref );\r
}\r
\r
{\r
IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;\r
DWORD ref = InterlockedDecrement( &This->ref );\r
+ \r
if( !ref )\r
{\r
DestroyWindow( This->hDialog );\r
HeapFree( GetProcessHeap(), 0, This );\r
}\r
+\r
+ SHDOCVW_UnlockModule();\r
+ \r
return ref;\r
}\r
\r
\r
static HRESULT WINAPI WB_QueryInterface(IWebBrowser *iface, REFIID riid, LPVOID *ppobj)\r
{\r
- IWebBrowserImpl *This = (IWebBrowserImpl *)iface;\r
+ FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
\r
- FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+ if (ppobj == NULL) return E_POINTER;\r
+ \r
return E_NOINTERFACE;\r
}\r
\r
static ULONG WINAPI WB_AddRef(IWebBrowser *iface)\r
{\r
- IWebBrowserImpl *This = (IWebBrowserImpl *)iface;\r
+ SHDOCVW_LockModule();\r
\r
- TRACE("\n");\r
- return ++(This->ref);\r
+ return 2; /* non-heap based object */\r
}\r
\r
static ULONG WINAPI WB_Release(IWebBrowser *iface)\r
{\r
- IWebBrowserImpl *This = (IWebBrowserImpl *)iface;\r
+ SHDOCVW_UnlockModule();\r
\r
- /* static class, won't be freed */\r
- TRACE("\n");\r
- return --(This->ref);\r
+ return 1; /* non-heap based object */\r
}\r
\r
/* IDispatch methods */\r
WB_get_Busy\r
};\r
\r
-IWebBrowserImpl SHDOCVW_WebBrowser = { &WB_Vtbl, 1 };\r
+IWebBrowserImpl SHDOCVW_WebBrowser = {&WB_Vtbl};\r