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