HRESULT BIGBLOCKFILE_ReadAt(LPBIGBLOCKFILE This, ULARGE_INTEGER offset, void* buffer, ULONG size, ULONG* bytesRead) { if (This->fileBased) return ImplBIGBLOCKFILE_ReadAt(This,offset,buffer,size,bytesRead); else return ILockBytes_ReadAt(This->pLkbyt,offset,buffer,size,bytesRead); }
/****************************************************************************** * GetHGlobalFromILockBytes [OLE32.@] * * Retrieve a global memory handle to a byte array object created * using the CreateILockBytesOnHGlobal function. * * PARAMS * plkbyt [ I] Pointer to the ILockBytes interface on byte array object * phglobal [ O] Address to store a global memory handle * RETURNS * S_OK if *phglobal has a correct value * E_INVALIDARG if any parameters are invalid * */ HRESULT WINAPI GetHGlobalFromILockBytes(ILockBytes* plkbyt, HGLOBAL* phglobal) { HGLOBALLockBytesImpl* const pMemLockBytes = (HGLOBALLockBytesImpl*)plkbyt; STATSTG stbuf; HRESULT hres; ULARGE_INTEGER start; ULONG xread; *phglobal = 0; if (pMemLockBytes->lpVtbl == &HGLOBALLockBytesImpl_Vtbl) { *phglobal = pMemLockBytes->supportHandle; if (*phglobal == 0) return E_INVALIDARG; return S_OK; } /* It is not our lockbytes implementation, so use a more generic way */ hres = ILockBytes_Stat(plkbyt,&stbuf,0); if (hres != S_OK) { ERR("Cannot ILockBytes_Stat, %lx\n",hres); return hres; } FIXME("cbSize is %ld\n",stbuf.cbSize.u.LowPart); *phglobal = GlobalAlloc( GMEM_MOVEABLE|GMEM_SHARE, stbuf.cbSize.u.LowPart); if (!*phglobal) return E_INVALIDARG; memset(&start,0,sizeof(start)); hres = ILockBytes_ReadAt(plkbyt, start, GlobalLock(*phglobal), stbuf.cbSize.u.LowPart, &xread); GlobalUnlock(*phglobal); if (hres != S_OK) { FIXME("%p->ReadAt failed with %lx\n",plkbyt,hres); return hres; } if (stbuf.cbSize.u.LowPart != xread) { FIXME("Read size is not requested size %ld vs %ld?\n",stbuf.cbSize.u.LowPart, xread); } return S_OK; }