PATCH: Olepicture Dispatch Invoke
Marcus Meissner
marcus at jet.franken.de
Fri Nov 4 06:43:43 CST 2005
Hi,
ExpressPCB (http://bugs.winehq.org/show_bug.cgi?id=3752)
does some invokes on IPictures.
I implemented the ones it needs.
GetTypeInfo is stolen from olefont.c.
Ciao, Marcus
Changelog:
Implemented IDispatch::GetTypeInfo and started on IDispatch::Invoke
for OLE Pictures.
Index: olepicture.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/olepicture.c,v
retrieving revision 1.68
diff -u -r1.68 olepicture.c
--- dlls/oleaut32/olepicture.c 24 Aug 2005 09:44:25 -0000 1.68
+++ dlls/oleaut32/olepicture.c 4 Nov 2005 12:37:49 -0000
@@ -1940,13 +1985,28 @@
*/
static HRESULT WINAPI OLEPictureImpl_GetTypeInfo(
IDispatch* iface,
- UINT iTInfo,
+ UINT iTInfo,
LCID lcid,
ITypeInfo** ppTInfo)
{
- FIXME("():Stub\n");
-
- return E_NOTIMPL;
+ static const WCHAR stdole2tlb[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
+ ITypeLib *tl;
+ HRESULT hres;
+
+ OLEPictureImpl *this = impl_from_IDispatch(iface);
+ TRACE("(%p, iTInfo=%d, lcid=%04x, %p)\n", this, iTInfo, (int)lcid, ppTInfo);
+ if (iTInfo != 0)
+ return E_FAIL;
+ hres = LoadTypeLib(stdole2tlb, &tl);
+ if (FAILED(hres)) {
+ ERR("Could not load the stdole2.tlb?\n");
+ return hres;
+ }
+ hres = ITypeLib_GetTypeInfoOfGuid(tl, &IID_IPictureDisp, ppTInfo);
+ if (FAILED(hres)) {
+ FIXME("Did not IDispatch typeinfo from typelib, hres %lx\n",hres);
+ }
+ return hres;
}
/************************************************************************
@@ -1983,12 +2043,67 @@
EXCEPINFO* pExepInfo,
UINT* puArgErr)
{
- FIXME("(dispid: %ld):Stub\n",dispIdMember);
+ OLEPictureImpl *This = impl_from_IDispatch(iface);
+ HRESULT hres = E_FAIL;
+
+ FIXME("(dispid=%ld, riid=%s, wFlags=%x), partial stub.\n",dispIdMember, debugstr_guid(riid), wFlags);
VariantInit(pVarResult);
- V_VT(pVarResult) = VT_BOOL;
- V_BOOL(pVarResult) = FALSE;
- return S_OK;
+ switch (dispIdMember) {
+ case DISPID_PICT_HANDLE:
+ switch (wFlags) {
+ case DISPATCH_PROPERTYGET:
+ case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
+ V_VT(pVarResult) = VT_INT;
+ hres = S_OK;
+
+ switch(This->desc.picType) {
+ case PICTYPE_NONE:
+ V_INT(pVarResult) = 0;
+ break;
+ case PICTYPE_BITMAP:
+ V_INT(pVarResult) = (OLE_HANDLE)This->desc.u.bmp.hbitmap;
+ break;
+ case PICTYPE_METAFILE:
+ V_INT(pVarResult) = (OLE_HANDLE)This->desc.u.wmf.hmeta;
+ break;
+ case PICTYPE_ICON:
+ V_INT(pVarResult) = (OLE_HANDLE)This->desc.u.icon.hicon;
+ break;
+ case PICTYPE_ENHMETAFILE:
+ V_INT(pVarResult) = (OLE_HANDLE)This->desc.u.emf.hemf;
+ break;
+ default:
+ FIXME("Unimplemented type %d\n", This->desc.picType);
+ hres= E_NOTIMPL;
+ }
+ break;
+ default:
+ FIXME("DISPID_PICT_HANDLE unhandled flags %x\n", wFlags);
+ break;
+ }
+ break;
+ case DISPID_PICT_TYPE:
+ switch (wFlags) {
+ case DISPATCH_PROPERTYGET:
+ case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
+ V_VT(pVarResult) = VT_I2;
+ V_I2(pVarResult) = This->desc.picType;
+ break;
+ default:
+ FIXME("DISPID_PICT_TYPE unhandled flags %x\n", wFlags);
+ break;
+ }
+ break;
+ default:
+ FIXME("(dispid=%ld, wFlags=%x), stub\n",dispIdMember, wFlags);
+ break;
+ }
+ if (!SUCCEEDED(hres)) {
+ V_VT(pVarResult) = VT_BOOL;
+ V_BOOL(pVarResult) = FALSE;
+ }
+ return hres;
}
More information about the wine-patches
mailing list