void CompleteAutoSave(HANDLE hEvent, LPARAM lParam) { AutoSavePackage *pasp = (AutoSavePackage *)lParam; FastIStorage *pstgroot = pasp->pstg; IStorage *pstgDisk; WCHAR *wzSaveName = L"AutoSave"; WCHAR *wzSaveExtension = L".vpx"; WCHAR wzSuffix[32]; _itow_s(pasp->tableindex, wzSuffix, sizeof(wzSuffix)/sizeof(WCHAR), 10); WCHAR * const wzT = new WCHAR[MAX_PATH + 32 + lstrlenW(wzSaveName) + lstrlenW(wzSaveExtension)+ 1]; WideStrCopy(g_pvp->m_wzMyPath, wzT); WideStrCat(wzSaveName, wzT); WideStrCat(wzSuffix, wzT); WideStrCat(wzSaveExtension, wzT); //MAKE_WIDEPTR_FROMANSI(wszCodeFile, m_szFileName); STGOPTIONS stg; stg.usVersion = 1; stg.reserved = 0; stg.ulSectorSize = 4096; HRESULT hr; if(SUCCEEDED(hr = StgCreateStorageEx(wzT, STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, STGFMT_DOCFILE, 0, &stg, 0, IID_IStorage, (void**)&pstgDisk))) { pstgroot->CopyTo(0, NULL, NULL, pstgDisk); hr = pstgDisk->Commit(STGC_DEFAULT); pstgDisk->Release(); } pstgroot->Release(); SetEvent(hEvent); PostMessage(pasp->HwndTable, DONE_AUTOSAVE, (WPARAM)hEvent, hr); delete [] wzT; delete pasp; }
// @pymethod |PyIStorage|Commit|Ensures that any changes made to a storage object open in transacted mode are reflected in the parent storage; // for a root storage, reflects the changes in the actual device, for example, a file on disk. // For a root storage object opened in direct mode, this method has no effect except to flush all memory buffers to the disk. For non-root storage objects in direct mode, this method has no effect. PyObject *PyIStorage::Commit(PyObject *self, PyObject *args) { IStorage *pIS = GetI(self); if ( pIS == NULL ) return NULL; // @pyparm int|grfCommitFlags||Controls how the changes are committed to the storage object. See the STGC enumeration for a definition of these values. DWORD grfCommitFlags; if ( !PyArg_ParseTuple(args, "i:Commit", &grfCommitFlags) ) return NULL; PY_INTERFACE_PRECALL; HRESULT hr = pIS->Commit( grfCommitFlags ); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIS, IID_IStorage); Py_INCREF(Py_None); return Py_None; }
// 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; }
void SaveMsg2File(){ ULONG cbStrSize = 0L; LPWSTR lpWideCharStr = NULL; wchar_t szPath[_MAX_PATH]; // get temp file directory GetTempPath(_MAX_PATH, szPath); #ifdef MAPI32_W wcscat_s(szPath, L"Correct.msg"); #else wcscat_s(szPath, L"Garbage.msg"); #endif IStorage *pStorage = NULL; LPMSGSESS pMsgSession = NULL; LPMESSAGE pMessage = NULL; HRESULT hr = S_OK; //LPWSTR subject = L"テスト日本の";// L"ceshi测试12"; //LPWSTR body = L"テスト日本のテスト日本の"; // L"lhy测试12"; //LPWSTR receipt = L"*****@*****.**"; LPWSTR subject = L"Η πολιτική αβεβαιότητα ανησυχεί τις αγορές";// L"ceshi测试12"; LPWSTR body = L"Η πολιτική αβεβαιότητα ανησυχεί τις αγορές"; // L"lhy测试12"; LPWSTR receipt = L"*****@*****.**"; LPSTR subjectA = ConvertUnicode2Ansi(subject); LPSTR bodyA = ConvertUnicode2Ansi(body); LPSTR receiptA = ConvertUnicode2Ansi(receipt); //LPSTR subjectA = "ceshi测试12"; //LPSTR bodyA = "lhy测试12"; //LPSTR receiptA = "*****@*****.**"; do{ MAPIINIT_0 mapiInit = { 0, MAPI_MULTITHREAD_NOTIFICATIONS }; hr = MAPIInitialize(&mapiInit); DEFINE_IF_HR_NT_OK_BREAK(hr); LPMALLOC pMalloc = MAPIGetDefaultMalloc(); hr = StgCreateDocfile(szPath, STGM_READWRITE | STGM_TRANSACTED | STGM_CREATE, 0, &pStorage); DEFINE_IF_HR_NT_OK_BREAK(hr); hr = OpenIMsgSession(pMalloc, 0, &pMsgSession); DEFINE_IF_HR_NT_OK_BREAK(hr); #ifdef MAPI32_W // lhy comment:if load exmapi32.dll, this function will failed with error code 0x80040106. hr = OpenIMsgOnIStg(pMsgSession, MAPIAllocateBuffer, MAPIAllocateMore, MAPIFreeBuffer, pMalloc, NULL, pStorage, NULL, 0, MAPI_UNICODE, &pMessage); #else hr = OpenIMsgOnIStg(pMsgSession, MAPIAllocateBuffer, MAPIAllocateMore, MAPIFreeBuffer, pMalloc, NULL, pStorage, NULL, 0, 0, &pMessage); #endif DEFINE_IF_HR_NT_OK_BREAK(hr); hr = WriteClassStg(pStorage, CLSID_MailMessage); DEFINE_IF_HR_NT_OK_BREAK(hr); #ifdef MAPI32_W hr = SetPropsW(pMessage, subject, body, receipt, false, false, false, false, FORCE_SAVE); #else hr = SetPropsA(pMessage, subjectA, bodyA, receiptA, false, false, false, false, FORCE_SAVE); #endif DEFINE_IF_HR_NT_OK_BREAK(hr); hr = pStorage->Commit(STGC_DEFAULT); DEFINE_IF_HR_NT_OK_BREAK(hr); } while (0); delete subjectA; delete bodyA; delete receiptA; if (pMessage){ pMessage->Release(); pMessage = NULL; } if (pStorage){ pStorage->Release(); pStorage = NULL; } if (pMsgSession){ CloseIMsgSession(pMsgSession); pMsgSession = NULL; } MAPIUninitialize(); }