/*************************************************************************** * get_storage * * Retrieve an object's storage from a variety of sources. * * FIXME: CF_FILENAME. */ static HRESULT get_storage(IDataObject *data, IStorage *stg, UINT *src_cf) { HRESULT hr; FORMATETC fmt; STGMEDIUM med; IPersistStorage *persist; CLSID clsid; *src_cf = 0; /* CF_EMBEDEDOBJECT */ init_fmtetc(&fmt, embedded_object_clipboard_format, TYMED_ISTORAGE); med.tymed = TYMED_ISTORAGE; med.u.pstg = stg; hr = IDataObject_GetDataHere(data, &fmt, &med); if(SUCCEEDED(hr)) { *src_cf = embedded_object_clipboard_format; return hr; } /* CF_EMBEDSOURCE */ init_fmtetc(&fmt, embed_source_clipboard_format, TYMED_ISTORAGE); med.tymed = TYMED_ISTORAGE; med.u.pstg = stg; hr = IDataObject_GetDataHere(data, &fmt, &med); if(SUCCEEDED(hr)) { *src_cf = embed_source_clipboard_format; return hr; } /* IPersistStorage */ hr = IDataObject_QueryInterface(data, &IID_IPersistStorage, (void**)&persist); if(FAILED(hr)) return hr; hr = IPersistStorage_GetClassID(persist, &clsid); if(FAILED(hr)) goto end; hr = IStorage_SetClass(stg, &clsid); if(FAILED(hr)) goto end; hr = IPersistStorage_Save(persist, stg, FALSE); if(FAILED(hr)) goto end; hr = IPersistStorage_SaveCompleted(persist, NULL); end: IPersistStorage_Release(persist); return hr; }
static void test_olestream(void) { HRESULT hr; const CLSID non_existent_class = {0xa5f1772f, 0x3772, 0x490f, {0x9e, 0xc6, 0x77, 0x13, 0xe8, 0xb3, 0x4b, 0x5d}}; IOleObject *ole_obj; IPersistStorage *persist; IStorage *stg; IStream *stm; static const WCHAR olestream[] = {1,'O','l','e',0}; ULONG read; ole_stream_header_t header; hr = create_storage(&stg); ok(hr == S_OK, "got %08x\n", hr); hr = IStorage_OpenStream(stg, olestream, NULL, STGM_SHARE_EXCLUSIVE | STGM_READ, 0, &stm); ok(hr == STG_E_FILENOTFOUND, "got %08x\n", hr); hr = OleCreateDefaultHandler(&non_existent_class, 0, &IID_IOleObject, (void**)&ole_obj); ok(hr == S_OK, "got %08x\n", hr); hr = IOleObject_QueryInterface(ole_obj, &IID_IPersistStorage, (void**)&persist); ok(hr == S_OK, "got %08x\n", hr); hr = IPersistStorage_InitNew(persist, stg); ok(hr == S_OK, "got %08x\n", hr); hr = IStorage_OpenStream(stg, olestream, NULL, STGM_SHARE_EXCLUSIVE | STGM_READ, 0, &stm); ok(hr == S_OK, "got %08x\n", hr); hr = IStream_Read(stm, &header, sizeof(header), &read); ok(hr == S_OK, "got %08x\n", hr); ok(read == sizeof(header), "read %d\n", read); ok(header.version == 0x02000001, "got version %08x\n", header.version); ok(header.flags == 0x0, "got flags %08x\n", header.flags); ok(header.link_update_opt == 0x0, "got link update option %08x\n", header.link_update_opt); ok(header.res == 0x0, "got reserved %08x\n", header.res); ok(header.moniker_size == 0x0, "got moniker size %08x\n", header.moniker_size); IStream_Release(stm); IPersistStorage_Release(persist); IOleObject_Release(ole_obj); IStorage_Release(stg); }
/****************************************************************************** * OleCreate [OLE32.89] * */ HRESULT WINAPI OleCreate( REFCLSID rclsid, REFIID riid, DWORD renderopt, LPFORMATETC pFormatEtc, LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID* ppvObj) { HRESULT hres, hres1; IUnknown * pUnk = NULL; FIXME("\n\t%s\n\t%s stub!\n", debugstr_guid(rclsid), debugstr_guid(riid)); if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&pUnk)))) { if (pClientSite) { IOleObject * pOE; IPersistStorage * pPS; if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)&pOE)))) { TRACE("trying to set clientsite %p\n", pClientSite); hres1 = IOleObject_SetClientSite(pOE, pClientSite); TRACE("-- result 0x%08lx\n", hres1); IOleObject_Release(pOE); } if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)&pPS)))) { TRACE("trying to set stg %p\n", pStg); hres1 = IPersistStorage_InitNew(pPS, pStg); TRACE("-- result 0x%08lx\n", hres1); IPersistStorage_Release(pPS); } } } *ppvObj = pUnk; TRACE("-- %p \n", pUnk); return hres; }
static void test_packager(void) { IOleObject *oleobj; IPersistStorage *persist; DWORD len, bytes_read, status; HRESULT hr; HANDLE file; WCHAR filename[MAX_PATH]; char contents[11]; BOOL br, extended = FALSE; static const WCHAR filename3W[] = {'f','i','l','e','n','a','m','e','3','.','t','x','t',0}; hr = CoCreateInstance(&CLSID_Package, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void**)&oleobj); ok(hr == S_OK || hr == REGDB_E_CLASSNOTREG, "CoCreateInstance(CLSID_Package) failed: %08x\n", hr); if(hr == S_OK){ IOleObject_Release(oleobj); /* older OSes store temporary files in obscure locations, so don't run * the full tests on them */ extended = TRUE; }else win_skip("Older OS doesn't support modern packager\n"); hr = CoCreateInstance(&CLSID_Package_Alt, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void**)&oleobj); ok(hr == S_OK, "CoCreateInstance(CLSID_Package_Alt) failed: %08x\n", hr); hr = IOleObject_SetClientSite(oleobj, NULL); ok(hr == S_OK, "SetClientSite failed: %08x\n", hr); hr = IOleObject_SetClientSite(oleobj, &clientsite); ok(hr == S_OK, "SetClientSite failed: %08x\n", hr); hr = IOleObject_GetMiscStatus(oleobj, DVASPECT_CONTENT, NULL); ok(hr == E_INVALIDARG, "GetMiscStatus failed: %08x\n", hr); hr = IOleObject_GetMiscStatus(oleobj, DVASPECT_CONTENT, &status); ok(hr == S_OK, "GetMiscStatus failed: %08x\n", hr); ok(status == OLEMISC_ONLYICONIC || status == OLEMISC_CANTLINKINSIDE /* winxp */, "Got wrong DVASPECT_CONTENT status: 0x%x\n", status); hr = IOleObject_QueryInterface(oleobj, &IID_IPersistStorage, (void**)&persist); ok(hr == S_OK, "QueryInterface(IPersistStorage) failed: %08x\n", hr); hr = IPersistStorage_Load(persist, &stg); ok(hr == S_OK, "Load failed: %08x\n", hr); if(extended){ len = GetTempPathW(sizeof(filename) / sizeof(*filename), filename); lstrcpyW(filename + len, filename3W); file = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "Couldn't find temporary file %s: %u\n", wine_dbgstr_w(filename), GetLastError()); br = ReadFile(file, contents, sizeof(contents), &bytes_read, NULL); ok(br == TRUE, "ReadFile failed\n"); ok(bytes_read == 10, "Got wrong file size: %u\n", bytes_read); ok(!memcmp(contents, "some text\n", 10), "Got wrong file contents\n"); CloseHandle(file); } hr = IOleObject_Close(oleobj, OLECLOSE_NOSAVE); ok(hr == S_OK, "Close failed: %08x\n", hr); if(extended){ file = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "Temporary file shouldn't be deleted\n"); CloseHandle(file); } IPersistStorage_Release(persist); IOleObject_Release(oleobj); if(extended){ file = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ok(file == INVALID_HANDLE_VALUE, "Temporary file should be deleted\n"); } }