STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::GetConvertInfo( DWORD dwObject, CLSID* lpClassID, WORD* lpwFormat, CLSID*, LPCLSID*, UINT*) { COleClientItem* pItem = (COleClientItem*)dwObject; ASSERT_VALID(pItem); if (lpClassID != NULL) { if (pItem->GetType() == OT_LINK || S_OK != ReadClassStg(pItem->m_lpStorage, lpClassID)) { pItem->GetClassID(lpClassID); } } if (lpwFormat != NULL) { *lpwFormat = 0; CLIPFORMAT cf; if (ReadFmtUserTypeStg(pItem->m_lpStorage, &cf, NULL) == S_OK) *lpwFormat = (WORD)cf; } // Note: leave rest at default return S_OK; }
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; }
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; }
// @pymethod <o PyIID>|pythoncom|ReadClassStg|Reads a CLSID from a storage object. PyObject *pythoncom_ReadClassStg(PyObject *self, PyObject *args) { PyObject *obStg; if (!PyArg_ParseTuple(args, "O:ReadClassStg", &obStg)) // @pyparm <o PyIStorage>|storage||The storage to read the CLSID from. return NULL; IStorage *pStorage; if (!PyCom_InterfaceFromPyObject(obStg, IID_IStorage, (void **)&pStorage, FALSE)) return NULL; CLSID clsidRet; PY_INTERFACE_PRECALL; HRESULT hr = ReadClassStg(pStorage, &clsidRet); pStorage->Release(); PY_INTERFACE_POSTCALL; if (FAILED(hr)) return PyCom_BuildPyException(hr); return PyWinObject_FromIID(clsidRet); }
// Öffnen des PropertySequenceSubStorages static HRESULT GetSubPropSeqStorage (IStorage **ppIStg) { if (NULL == ppIStg) return E_POINTER; WStorage IRootStg; if (!DEX_GetProjectStorage(*IRootStg.ppv())) return E_FAIL; USES_CONVERSION; WStorage IStg; HRESULT hr = IRootStg -> OpenStorage (A2OLE(g_cbPropertyChoices), NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, NULL, 0L, IStg.ppi()); if (FAILED(hr)) { // mit Schreibschutz versuchen hr = IRootStg -> OpenStorage (A2OLE(g_cbPropertyChoices), NULL, STGM_READ|STGM_SHARE_EXCLUSIVE|STGM_TRANSACTED, NULL, 0L, IStg.ppi()); if (FAILED(hr)) return hr; } CLSID clsId; hr = ReadClassStg (IStg, &clsId); if (FAILED(hr)) return hr; if (!IsEqualCLSID (clsId, CLSID_PropertyChoice)) return E_FAIL; *ppIStg = IStg.detach(); return hr; }
COleConvertDialog::COleConvertDialog(COleClientItem* pItem, DWORD dwFlags, CLSID* pClassID, CWnd* pParentWnd) : COleDialog(pParentWnd) { if (pItem != NULL) ASSERT_VALID(pItem); ASSERT(pClassID == NULL || AfxIsValidAddress(pClassID, sizeof(CLSID), FALSE)); memset(&m_cv, 0, sizeof(m_cv)); // initialize structure to 0/NULL if (pClassID != NULL) m_cv.clsid = *pClassID; // fill in common part m_cv.cbStruct = sizeof(m_cv); m_cv.dwFlags = dwFlags; if (!afxData.bWin4 && AfxHelpEnabled()) m_cv.dwFlags |= CF_SHOWHELPBUTTON; m_cv.lpfnHook = AfxOleHookProc; m_nIDHelp = AFX_IDD_CONVERT; // specific to this dialog m_cv.fIsLinkedObject = pItem->GetType() == OT_LINK; m_cv.dvAspect = pItem->GetDrawAspect(); if (pClassID == NULL && !m_cv.fIsLinkedObject) { // for embeddings, attempt to get class ID from the storage if (ReadClassStg(pItem->m_lpStorage, &m_cv.clsid) == S_OK) pClassID = &m_cv.clsid; // attempt to get user type from storage CLIPFORMAT cf = 0; LPOLESTR lpOleStr = NULL; ReadFmtUserTypeStg(pItem->m_lpStorage, &cf, &lpOleStr); m_cv.lpszUserType = TASKSTRINGOLE2T(lpOleStr); m_cv.wFormat = (WORD)cf; } // get class id if neded if (pClassID == NULL) { // no class ID in the storage, use class ID of the object pItem->GetClassID(&m_cv.clsid); } // get user type if needed if (m_cv.lpszUserType == NULL) { // no user type in storge, get user type from class ID LPTSTR lpszUserType = NULL; LPOLESTR lpOleStr = NULL; if (OleRegGetUserType(m_cv.clsid, USERCLASSTYPE_FULL, &lpOleStr) == S_OK) { lpszUserType = TASKSTRINGOLE2T(lpOleStr); } else { lpszUserType = (LPTSTR)CoTaskMemAlloc(256 * sizeof(TCHAR)); if (lpszUserType != NULL) { lpszUserType[0] = '?'; lpszUserType[1] = 0; VERIFY(AfxLoadString(AFX_IDS_UNKNOWNTYPE, lpszUserType) != 0); } } m_cv.lpszUserType = lpszUserType; } m_cv.hMetaPict = pItem->GetIconicMetafile(); }
// Ö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; }