|
|
#include "shellprv.h"
#include "util.h"
#include "datautil.h"
#include "idlcomm.h"
#include "stgutil.h"
#include "ole2dup.h"
STDAPI StgCopyFileToStream(LPCTSTR pszSrc, IStream *pStream) { IStream *pStreamSrc; DWORD grfModeSrc = STGM_READ | STGM_DIRECT | STGM_SHARE_DENY_WRITE; HRESULT hr = SHCreateStreamOnFileEx(pszSrc, grfModeSrc, 0, FALSE, NULL, &pStreamSrc);
if (SUCCEEDED(hr)) { ULARGE_INTEGER ulMax = {-1, -1}; hr = pStreamSrc->CopyTo(pStream, ulMax, NULL, NULL); pStreamSrc->Release(); }
if (SUCCEEDED(hr)) { hr = pStream->Commit(STGC_DEFAULT); }
return hr; }
STDAPI StgBindToObject(LPCITEMIDLIST pidl, DWORD grfMode, REFIID riid, void **ppv) { IBindCtx *pbc; HRESULT hr = BindCtx_CreateWithMode(grfMode, &pbc); if (SUCCEEDED(hr)) { hr = SHBindToObjectEx(NULL, pidl, pbc, riid, ppv);
pbc->Release(); } return hr; }
typedef HRESULT (WINAPI * PSTGOPENSTORAGEONHANDLE)(HANDLE,DWORD,void*,void*,REFIID,void**);
STDAPI SHStgOpenStorageOnHandle(HANDLE h, DWORD grfMode, void *res1, void *res2, REFIID riid, void **ppv) { static PSTGOPENSTORAGEONHANDLE pfn = NULL; if (pfn == NULL) { HMODULE hmodOle32 = LoadLibraryA("ole32.dll");
if (hmodOle32) { pfn = (PSTGOPENSTORAGEONHANDLE)GetProcAddress(hmodOle32, "StgOpenStorageOnHandle"); } }
if (pfn) { return pfn(h, grfMode, res1, res2, riid, ppv); } else { return E_OUTOFMEMORY; } }
STDAPI StgOpenStorageOnFolder(LPCTSTR pszFolder, DWORD grfFlags, REFIID riid, void **ppv) { *ppv = NULL;
DWORD dwDesiredAccess, dwShareMode, dwCreationDisposition; HRESULT hr = ModeToCreateFileFlags(grfFlags, FALSE, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition); if (SUCCEEDED(hr)) { // For IPropertySetStorage, we don't want to unnecessarily tie up access to the folder, if all
// we're doing is dealing with property sets. The implementation of IPropertySetStorage for
// NTFS files is defined so that the sharing/access only applies to the property set stream, not
// it's other streams. So it makes sense to do a CreateFile on a folder with full sharing, while perhaps specifying
// STGM_SHARE_EXCLUSIVE for the property set storage.
if (riid == IID_IPropertySetStorage) dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
// FILE_FLAG_BACKUP_SEMANTICS to get a handle on the folder
HANDLE h = CreateFile(pszFolder, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_FLAG_BACKUP_SEMANTICS, INVALID_HANDLE_VALUE); if (INVALID_HANDLE_VALUE != h) { hr = SHStgOpenStorageOnHandle(h, grfFlags, NULL, NULL, riid, ppv); CloseHandle(h); } else { hr = HRESULT_FROM_WIN32(GetLastError()); } } return hr; }
// various helper classes removed for security push -- if it gets RI'd back into Lab06 somehow
// and they're needed, just put em back.
// this includes a wrapper for docfile IStorages to make them play nice and a shortcut-storage
// which dereferences links on the fly.
//
// gpease 05-MAR-2003
// If you do put them back, make sure the Release implementation is correct!
//
|