// @pymethod <o PyIStream>|PyIStorage|CreateStream|Creates and opens a stream object with the specified name contained in this storage object. All elements within a storage object — both streams and other storage objects — are kept in the same name space. PyObject *PyIStorage::CreateStream(PyObject *self, PyObject *args) { IStorage *pIS = GetI(self); if ( pIS == NULL ) return NULL; // @pyparm string|pwcsName||Name of the new stream // @pyparm int|grfMode||Specifies the access mode to use when opening the newly created stream. // @pyparm int|reserved1|0|Reserved - must be zero. // @pyparm int|reserved2|0|Reserved - must be zero. DWORD grfMode; DWORD reserved1 = 0; DWORD reserved2 = 0; PyObject *obName; if ( !PyArg_ParseTuple(args, "Oi|ii:CreateStream", &obName, &grfMode, &reserved1, &reserved2) ) return NULL; IStream *ppstm; BOOL bPythonIsHappy = TRUE; BSTR bstrName; bPythonIsHappy = PyWinObject_AsBstr(obName, &bstrName); if (!bPythonIsHappy) return NULL; PY_INTERFACE_PRECALL; HRESULT hr = pIS->CreateStream( bstrName, grfMode, reserved1, reserved2, &ppstm ); PyWinObject_FreeBstr(bstrName); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIS, IID_IStorage); return PyCom_PyObjectFromIUnknown(ppstm, IID_IStream, FALSE); }
int _tmain(int argc, _TCHAR* argv[]) { CLSID wid; CoInitialize(NULL); CLSIDFromString(const_cast<wchar_t*>(default_guid), &wid); IInitializeWithFile *oo; HRESULT hr; if ((hr = CoCreateInstance(wid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&oo))) != S_OK) fail(); #if 0 IStorage *isto; if ((hr = StgCreateDocfile(L"t.mp3", STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DIRECT, 0, &isto)) != S_OK) fail(); IStream *is; if ((hr = isto->CreateStream(L"lol", STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &is)) != S_OK) fail(); #endif IPropertyStore *ips; IPropertyStoreCapabilities *ipcs; if ((hr = oo->QueryInterface(IID_PPV_ARGS(&ips))) != S_OK) fail(); if ((hr = oo->QueryInterface(IID_PPV_ARGS(&ipcs))) != S_OK) fail(); //iws->Initialize(is, STGM_READWRITE); if ((hr = oo->Initialize(L"t.mp3", STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DIRECT)) != S_OK) fail(); DWORD props; if ((hr = ips->GetCount(&props)) != S_OK) fail(); for (DWORD i = 0; i < props; ++i) { PROPERTYKEY pkey; ips->GetAt(i, &pkey); WCHAR *sz; PSGetNameFromPropertyKey(pkey, &sz); std::wcout << (ipcs->IsPropertyWritable(pkey) == S_OK) << "\t" << sz << std::endl; } return 0; }
// This code was also brazenly stolen from the DX9 SDK // Pass it a file name in wszPath, and it will save the filter graph to that file. HRESULT SaveGraphFile(IGraphBuilder *pGraph, WCHAR *wszPath) { const WCHAR wszStreamName[] = L"ActiveMovieGraph"; HRESULT hr; IStorage *pStorage = NULL; // First, create a document file which will hold the GRF file hr = StgCreateDocfile( wszPath, STGM_CREATE | STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &pStorage); if(FAILED(hr)) { return hr; } // Next, create a stream to store. IStream *pStream; hr = pStorage->CreateStream( wszStreamName, STGM_WRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, 0, &pStream); if (FAILED(hr)) { pStorage->Release(); return hr; } // The IPersistStream converts a stream into a persistent object. IPersistStream *pPersist = NULL; pGraph->QueryInterface(IID_IPersistStream, reinterpret_cast<void**>(&pPersist)); hr = pPersist->Save(pStream, TRUE); pStream->Release(); pPersist->Release(); if (SUCCEEDED(hr)) { hr = pStorage->Commit(STGC_DEFAULT); } pStorage->Release(); return hr; }
HRESULT SaveGraphFile(IGraphBuilder *pGraph, WCHAR *wszPath) { const WCHAR wszStreamName[] = L"ActiveMovieGraph"; HRESULT hr; IStorage *pStorage = NULL; hr = StgCreateDocfile( wszPath, STGM_CREATE | STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &pStorage); if(FAILED(hr)) { return hr; } IStream *pStream; hr = pStorage->CreateStream( wszStreamName, STGM_WRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, 0, &pStream); if (FAILED(hr)) { pStorage->Release(); return hr; } IPersistStream *pPersist = NULL; pGraph->QueryInterface(IID_IPersistStream, (void**)&pPersist); hr = pPersist->Save(pStream, TRUE); pStream->Release(); pPersist->Release(); if (SUCCEEDED(hr)) { hr = pStorage->Commit(STGC_DEFAULT); } pStorage->Release(); return hr; }
// Does: Saves The Picture That Is Stored In The IPicture Object As a Bitmap // ~~~~ (Converts From Any Known Picture Type To a Bitmap / Icon File) // // InPut: sFilePathName - Path And FileName Target To Save // ~~~~~ // // OutPut: TRUE If Succeeded... // ~~~~~~ //----------------------------------------------------------------------------- BOOL CPicture_Ex::SaveAsBitmap(CString sFilePathName) //============================================================================= { BOOL bResult = FALSE; ILockBytes *Buffer = 0; IStorage *pStorage = 0; IStream *FileStream = 0; BYTE *BufferBytes; STATSTG BytesStatistics; DWORD OutData; long OutStream; CFile BitmapFile; CFileException e; double SkipFloat = 0; DWORD ByteSkip = 0; _ULARGE_INTEGER RealData; CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage); hr = pStorage->CreateStream(L"PICTURE", STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream); m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream FileStream->Release(); pStorage->Release(); Buffer->Flush(); // Get Statistics For Final Size Of Byte Array Buffer->Stat(&BytesStatistics, STATFLAG_NONAME); // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only "Pure" Picture Data) SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks... if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1; else ByteSkip = (DWORD)SkipFloat; ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks... // Find Difference Between The Two Values ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip); // Allocate Only The "Pure" Picture Data RealData.LowPart = 0; RealData.HighPart = 0; RealData.QuadPart = ByteSkip; BufferBytes = (BYTE*)malloc(OutStream); if(BufferBytes == NULL) { Buffer->Release(); HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd; MessageBoxEx(hWnd, "Can not allocate enough memory\t", "ERROR"/*ERROR_TITLE*/, MB_OK | MB_ICONSTOP, LANG_ENGLISH); } Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData); if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e)) { BitmapFile.Write(BufferBytes, OutData); BitmapFile.Close(); bResult = TRUE; } else // Write File Failed... { TCHAR szCause[255]; e.GetErrorMessage(szCause, 255, NULL); HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd; MessageBoxEx(hWnd, szCause, "ERROR"/*ERROR_TITLE*/, MB_OK | MB_ICONSTOP, LANG_ENGLISH); bResult = FALSE; } Buffer->Release(); free(BufferBytes); return(bResult); }