// @pymethod |pythoncom|WriteClassStg|Writes a CLSID to a storage object PyObject *pythoncom_WriteClassStg(PyObject *self, PyObject *args) { PyObject *obStg; PyObject *obCLSID; if (!PyArg_ParseTuple(args, "OO:WriteClassStg", &obStg, // @pyparm <o PyIStorage>|storage||Storage object into which CLSID will be written. &obCLSID)) // @pyparm <o PyIID>|iid||The IID to write return NULL; CLSID clsid; if (!PyWinObject_AsIID(obCLSID, &clsid)) return NULL; IStorage *pStorage; if (!PyCom_InterfaceFromPyObject(obStg, IID_IStorage, (void **)&pStorage, FALSE)) return NULL; PY_INTERFACE_PRECALL; HRESULT hr = WriteClassStg(pStorage, clsid); pStorage->Release(); PY_INTERFACE_POSTCALL; if (FAILED(hr)) return PyCom_BuildPyException(hr); Py_INCREF(Py_None); return Py_None; }
SCODE AFXAPI _AfxOleDoConvert(LPSTORAGE lpStg, REFCLSID rClsidNew) { SCODE sc; CLSID clsidOld; if ((sc = ReadClassStg(lpStg, &clsidOld)) != S_OK) { clsidOld = CLSID_NULL; return sc; } // read old fmt/old user type; sets out params to NULL on error CLIPFORMAT cfOld; LPOLESTR lpszOld = NULL; sc = ReadFmtUserTypeStg(lpStg, &cfOld, &lpszOld); ASSERT(sc == S_OK || (cfOld == 0 && lpszOld == NULL)); // get new user type name; if error, set to NULL string OLECHAR chZero = 0; LPOLESTR lpszNew = NULL; if (OleRegGetUserType(rClsidNew, USERCLASSTYPE_FULL, &lpszNew) != S_OK) lpszNew = &chZero; // write class stg if ((sc = WriteClassStg(lpStg, rClsidNew)) != S_OK) goto ErrorReturn; // write old fmt/new user type; if ((sc = WriteFmtUserTypeStg(lpStg, cfOld, lpszNew)) != S_OK) goto RewriteInfo; // set convert bit if ((sc = SetConvertStg(lpStg, TRUE)) != S_OK) goto RewriteInfo; goto ErrorReturn; RewriteInfo: WriteClassStg(lpStg, clsidOld); WriteFmtUserTypeStg(lpStg, cfOld, lpszOld); ErrorReturn: if (lpszNew != &chZero) CoTaskMemFree(lpszNew); CoTaskMemFree(lpszOld); return sc; }
HRESULT MakeRootStorage(LPSTORAGE *ppIStorage, LPCSTR pPathName) { HRESULT hr = NOERROR; DWORD dwMode = STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_TRANSACTED ; char *pNameToUse = new char [_MAX_PATH]; LPSTORAGE pIStorage = *ppIStorage; if (NULL == pNameToUse || NULL == pPathName) return ResultFromScode(E_FAIL); // alte ProjektStruktur, eigenes DocFile erzeugen/öffnen // erstellt Pfadnamen hr = MakeFileName (pPathName, pNameToUse, "str"); if (FAILED(hr)) return hr; // Funktionen machen Addref(), Release() im Destruktor (Memberpointer Rootstorage) USES_CONVERSION; hr = StgOpenStorage (A2OLE(pNameToUse), NULL, dwMode, 0, 0, &pIStorage); if (FAILED(hr)) { if (GetScode(hr) == STG_E_FILENOTFOUND) { // neu anlegen dwMode |= STGM_CREATE; hr = StgCreateDocfile (A2OLE(pNameToUse), dwMode, 0, &pIStorage); delete (pNameToUse); if (FAILED(hr)) return hr; // GUID reinschreiben (Kontrollmöglichkeit) hr = WriteClassStg (pIStorage, CLSID_ScriptContainer); if (FAILED(hr)) { pIStorage -> Release(); return hr; } } else { delete (pNameToUse); return hr; } } else delete (pNameToUse); hr = TestclsID (pIStorage, CLSID_ScriptContainer); if (FAILED(hr)) { pIStorage -> Release(); return hr; } *ppIStorage = pIStorage; return NOERROR; }
HRESULT TestclsID (LPSTORAGE pIStorage, const CLSID &clsIDTest) { CLSID clsID; HRESULT hr = ReadClassStg (pIStorage, &clsID); if (FAILED(hr)) return hr; if (!IsEqualCLSID (clsID, clsIDTest)) { if (clsID == CLSID_NULL) // Absturz beim letzten mal hr = WriteClassStg (pIStorage, clsIDTest); else hr = ResultFromScode(E_FAIL); } return hr; }
void COleLinkingDoc::SaveToStorage(CObject* pObject) { ASSERT_VALID(this); if (pObject != NULL) ASSERT_VALID(pObject); // write the classID of the application to the root storage if (m_pFactory != NULL) { ASSERT(m_lpRootStg != NULL); WriteClassStg(m_lpRootStg, m_pFactory->GetClassID()); } COleDocument::SaveToStorage(pObject); }
HRESULT MakeSubStorage(LPSTORAGE pIRootStorage, LPSTORAGE *ppISubStorage, const CString &strStorName, bool &fNew, bool fDirect, CLSID clsID) { LPSTORAGE pIStorage; HRESULT hr; DWORD dw = 0; DWORD dwMode = STGM_READWRITE | STGM_SHARE_EXCLUSIVE ; if (fDirect) dwMode = dwMode | STGM_DIRECT; else dwMode = dwMode | STGM_TRANSACTED; if (NULL == pIRootStorage) return ResultFromScode(STG_E_INVALIDPOINTER); USES_CONVERSION; hr = pIRootStorage -> OpenStorage ( A2OLE(strStorName), NULL, dwMode, NULL, 0, &pIStorage); if (FAILED(hr)) { if (STG_E_FILENOTFOUND == GetScode(hr)) { hr = pIRootStorage -> CreateStorage ( A2OLE(strStorName), dwMode, 0, 0, &pIStorage); if (SUCCEEDED(hr)) { hr = WriteClassStg (pIStorage, clsID); fNew = true; } else { *ppISubStorage = NULL; return hr; } } else { *ppISubStorage = NULL; return hr; } } hr = TestclsID (pIStorage, clsID); if (FAILED(hr)) { pIStorage -> Release(); return hr; } *ppISubStorage = pIStorage; return NOERROR; }
static HRESULT SavePropSeq ( LPCSTR pcDesc, IPropertyActionSequence *pISeq, IStorage *pIStg) { HRESULT hr = E_FAIL; WStorage IStg (pIStg); USES_CONVERSION; if (NULL == pIStg) { // SubStorage anlegen, da es noch nicht existiert WStorage IRootStg; if (!DEX_GetProjectStorage(*IRootStg.ppv())) return E_FAIL; hr = IRootStg -> CreateStorage (A2OLE(g_cbPropertyChoices), STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, 0L, 0L, IStg.ppi()); if (FAILED(hr)) return hr; hr = WriteClassStg (IStg, CLSID_PropertyChoice); if (FAILED(hr)) return hr; } try { WStream IStm; WPersistStream IPersistStm (pISeq); // throws hr string strName = MakeStreamName(pcDesc); // Stream erzeugen hr = IStg -> CreateStream (A2OLE(strName.c_str()), STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_CREATE, 0L, 0L, IStm.ppi()); if (FAILED(hr)) _com_issue_error(hr); hr = OleSaveToStream (IPersistStm, IStm); // und wegschreiben if (FAILED(hr)) _com_issue_error(hr); hr = IStm -> Commit (STGC_DEFAULT); if (FAILED(hr)) _com_issue_error(hr); } catch (_com_error& hr) { return _COM_ERROR(hr); } hr = IStg -> Commit (STGC_DEFAULT); if (SUCCEEDED(hr)) DEX_SetDirtyGeoDB(true); return hr; }
// Öffnen des PropertySequenceSubStorages static HRESULT GetSubPropSeqStorage (IStorage **ppIStg, bool fCreate = false) { if (NULL == ppIStg) return E_POINTER; WStorage IRootStg; if (!DEX_GetProjectStorage(*IRootStg.ppv())) return E_FAIL; USES_CONVERSION; WStorage IStg; HRESULT hr = E_FAIL; { bool fRO = false; hr = IRootStg -> OpenStorage (A2OLE(g_cbPropertySequences), NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, NULL, 0L, IStg.ppi()); if (FAILED(hr)) { if (STG_E_FILENOTFOUND == GetScode(hr) && fCreate) { // existiert nicht, evtl. neu erzeugen hr = IRootStg -> CreateStorage (A2OLE(g_cbPropertySequences), STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED|STGM_CREATE, 0L, 0L, IStg.ppi()); if (SUCCEEDED(hr)) hr = WriteClassStg (IStg, CLSID_PropertyActionSequence); } else if (STG_E_ACCESSDENIED == GetScode(hr)) { // mit Schreibschutz versuchen hr = IRootStg -> OpenStorage (A2OLE(g_cbPropertySequences), NULL, STGM_READ|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, NULL, 0L, IStg.ppi()); fRO = true; } else return hr; } if (SUCCEEDED(hr)) { CLSID clsId; hr = ReadClassStg (IStg, &clsId); if (FAILED(hr)) return hr; if (!IsEqualCLSID(clsId, CLSID_PropertyActionSequence) && !IsEqualCLSID(clsId, CLSID_NULL)) { return E_FAIL; } if (IsEqualCLSID(clsId, CLSID_NULL) && !fRO) hr = WriteClassStg (IStg, CLSID_PropertyActionSequence); } } if (FAILED(hr)) return hr; *ppIStg = IStg.detach(); 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(); }