RImage* QSLItemData::Load( CString& strDocPathname, // @parm string containing document pathname BOOL fDescOnly ) { USES_CONVERSION; LPSTORAGE pIStorage = NULL; // get path name in Unicode const WCHAR *pDocPathname = T2COLE((LPCTSTR)strDocPathname.GetBuffer (10)); strDocPathname.ReleaseBuffer(); // open storage StgOpenStorage( pDocPathname, NULL, STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, 0, &pIStorage ); if (!pIStorage) return NULL ; RImage* pImage = Load2( pIStorage, fDescOnly ); if (dynamic_cast<RBitmapImage *>( pImage )) ((RBitmapImage *) pImage)->LockImage(); // release storage pIStorage->Release(); return( pImage ); }
UINT WriteThreadProc(LPVOID pParam) { USES_CONVERSION; LPSTORAGE pStgRoot = NULL; g_nIndent = 0; VERIFY(::StgCreateDocfile(T2COLE(g_szRootStorageName), STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, 0, &pStgRoot) == S_OK); ReadDirectory("\\", pStgRoot); pStgRoot->Release(); AfxMessageBox("Write complete"); return 0; }
void COleServerItem::GetEmbedSourceData(LPSTGMEDIUM lpStgMedium) { ASSERT_VALID(this); ASSERT(AfxIsValidAddress(lpStgMedium, sizeof(STGMEDIUM))); LPLOCKBYTES lpLockBytes; SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); if (sc != S_OK) AfxThrowOleException(sc); ASSERT(lpLockBytes != NULL); LPSTORAGE lpStorage; sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage); if (sc != S_OK) { VERIFY(lpLockBytes->Release() == 0); AfxThrowOleException(sc); } ASSERT(lpStorage != NULL); // setup for save copy as COleServerDoc* pDoc = GetDocument(); pDoc->m_bSameAsLoad = FALSE; pDoc->m_bRemember = FALSE; TRY { OnSaveEmbedding(lpStorage); pDoc->CommitItems(FALSE); } CATCH_ALL(e) { // release storage and lock bytes VERIFY(lpStorage->Release() == 0); VERIFY(lpLockBytes->Release() == 0); pDoc->m_bSameAsLoad = TRUE; pDoc->m_bRemember = TRUE; THROW_LAST(); } END_CATCH_ALL pDoc->m_bSameAsLoad = TRUE; pDoc->m_bRemember = TRUE; lpLockBytes->Release(); // add it to the data source lpStgMedium->tymed = TYMED_ISTORAGE; lpStgMedium->pstg = lpStorage; lpStgMedium->pUnkForRelease = NULL; }
void CEx27bView::OnEditPastefrom() { CEx27bDoc* pDoc = GetDocument(); // Paste from an .STG file CFileDialog dlg(TRUE, "stg", "*.stg"); if (dlg.DoModal() != IDOK) { return; } // Open the storage and substorage LPSTORAGE pStgRoot; VERIFY(::StgOpenStorage(dlg.GetPathName().AllocSysString(), NULL, STGM_READ|STGM_SHARE_EXCLUSIVE, NULL, 0, &pStgRoot) == S_OK); ASSERT(pStgRoot != NULL); LPSTORAGE pStgSub; VERIFY(pStgRoot->OpenStorage(CEx27bDoc::s_szSub, NULL, STGM_READ|STGM_SHARE_EXCLUSIVE, NULL, 0, &pStgSub) == S_OK); ASSERT(pStgSub != NULL); // Copy the object data from the user storage to the temporary storage VERIFY(pStgSub->CopyTo(NULL, NULL, NULL, pDoc->m_pTempStgSub) == S_OK); // Finally, load the object -- pClientSite not necessary LPOLECLIENTSITE pClientSite = (LPOLECLIENTSITE) pDoc->GetInterface(&IID_IOleClientSite); ASSERT(pClientSite != NULL); pDoc->DeleteContents(); VERIFY(::OleLoad(pDoc->m_pTempStgSub, IID_IOleObject, pClientSite, (void**) &pDoc->m_lpOleObj) == S_OK); SetViewAdvise(); pStgSub->Release(); pStgRoot->Release(); GetSize(); pDoc->SetModifiedFlag(); pDoc->UpdateAllViews(NULL); }
void CEx27bView::OnEditCopyto() { // Copy text to an .STG file (nothing special about STG ext) CFileDialog dlg(FALSE, "stg", "*.stg"); if (dlg.DoModal() != IDOK) { return; } CEx27bDoc* pDoc = GetDocument(); // Create a structured storage home for the object (m_pStgSub). // Create a root storage file, then a substorage named "sub." LPSTORAGE pStgRoot; VERIFY(::StgCreateDocfile(dlg.GetPathName().AllocSysString(), STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_CREATE, 0, &pStgRoot) == S_OK); ASSERT(pStgRoot != NULL); LPSTORAGE pStgSub; VERIFY(pStgRoot->CreateStorage(CEx27bDoc::s_szSub, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pStgSub) == S_OK); ASSERT(pStgSub != NULL); // Get the IPersistStorage* for the object LPPERSISTSTORAGE pPS = NULL; VERIFY(pDoc->m_lpOleObj->QueryInterface(IID_IPersistStorage, (void**) &pPS) == S_OK); // Finally, save the object in its new home in the user's file VERIFY(::OleSave(pPS, pStgSub, FALSE) == S_OK); // FALSE means different stg pPS->SaveCompleted(NULL); // What does this do? pPS->Release(); pStgSub->Release(); pStgRoot->Release(); }
void ReadStorage(LPSTORAGE pStg) // reads one storage -- recursive calls for substorages { USES_CONVERSION; LPSTORAGE pSubStg = NULL; LPSTREAM pStream = NULL; LPENUMSTATSTG pEnum = NULL; LPMALLOC pMalloc = NULL; // for freeing statstg STATSTG statstg; ULONG nLength; BYTE buffer[101]; g_nIndent++; ::CoGetMalloc(MEMCTX_TASK, &pMalloc); // assumes AfxOleInit // was called VERIFY(pStg->EnumElements(0, NULL, 0, &pEnum) == S_OK); while (pEnum->Next(1, &statstg, NULL) == S_OK) { if (statstg.type == STGTY_STORAGE) { VERIFY(pStg->OpenStorage(statstg.pwcsName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, 0, &pSubStg) == S_OK); ASSERT(pSubStg != NULL); TRACE("%0.*sStorage = %s\n", (g_nIndent - 1) * 4, g_szBlanks, OLE2CT(statstg.pwcsName)); ReadStorage(pSubStg); pSubStg->Release(); } else if (statstg.type == STGTY_STREAM) { VERIFY(pStg->OpenStream(statstg.pwcsName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pStream) == S_OK); ASSERT(pStream != NULL); TRACE("%0.*sStream = %s\n", (g_nIndent - 1) * 4, g_szBlanks, OLE2CT(statstg.pwcsName)); pStream->Read(buffer, 100, &nLength); buffer[nLength] = '\0'; TRACE("%s\n", buffer); pStream->Release(); } else { ASSERT(FALSE); // LockBytes? } pMalloc->Free(statstg.pwcsName); // avoids memory leaks } pMalloc->Release(); pEnum->Release(); g_nIndent--; }
UINT ReadThreadProc(LPVOID pParam) { USES_CONVERSION; LPSTORAGE pStgRoot = NULL; // doesn't work without STGM_SHARE_EXCLUSIVE g_nIndent = 0; if (::StgOpenStorage(T2COLE(g_szRootStorageName), NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, 0, &pStgRoot) == S_OK) { ASSERT(pStgRoot!= NULL); ReadStorage(pStgRoot); pStgRoot->Release(); } else { AfxMessageBox("Storage file not available or not readable"); } AfxMessageBox("Read complete"); return 0; }
void ReadDirectory(const char* szPath, LPSTORAGE pStg) { // recursive function USES_CONVERSION; WIN32_FIND_DATA fData; HANDLE h; char szNewPath[MAX_PATH]; char szStorageName[100]; char szStreamName[100]; char szData[81]; char* pch = NULL; LPSTORAGE pSubStg = NULL; LPSTREAM pStream = NULL; g_nIndent++; strcpy(szNewPath, szPath); strcat(szNewPath, "*.*"); h = ::FindFirstFile(szNewPath, &fData); if (h == (HANDLE) 0xFFFFFFFF) return; // can't find directory do { if (!strcmp(fData.cFileName, "..") || !strcmp(fData.cFileName, ".") ) continue; while((pch = strchr(fData.cFileName, '!')) != NULL) { *pch = '|'; } if (fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // It's a directory, so make a storage strcpy(szNewPath, szPath); strcat(szNewPath,fData.cFileName); strcat(szNewPath, "\\"); strcpy(szStorageName, fData.cFileName); szStorageName[31] = '\0'; // limit imposed by OLE TRACE("%0.*sStorage = %s\n", (g_nIndent - 1) * 4, g_szBlanks, szStorageName); VERIFY(pStg->CreateStorage(T2COLE(szStorageName), STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pSubStg) == S_OK); ASSERT(pSubStg != NULL); ReadDirectory(szNewPath, pSubStg); pSubStg->Release(); } else { if ((pch = strrchr(fData.cFileName, '.')) != NULL) { if (!stricmp(pch, ".TXT")) { // It's a text file, so make a stream strcpy(szStreamName, fData.cFileName); strcpy(szNewPath, szPath); strcat(szNewPath, szStreamName); szStreamName[32] = '\0'; // OLE max length TRACE("%0.*sStream = %s\n", (g_nIndent - 1) * 4, g_szBlanks, szNewPath); CStdioFile file(szNewPath, CFile::modeRead); // Ignore zero-length files if(file.ReadString(szData, 80)) { TRACE("%s\n", szData); VERIFY(pStg->CreateStream(T2COLE(szStreamName), STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pStream) == S_OK); ASSERT(pStream != NULL); // Include the null terminator in the stream pStream->Write(szData, strlen(szData) + 1, NULL); pStream->Release(); } } } } } while (::FindNextFile(h, &fData)); g_nIndent--; }
BOOL COleControl::GetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium, REFCLSID fmtid) { ASSERT_VALID(this); ASSERT(AfxIsValidAddress(lpFormatEtc, sizeof(FORMATETC), FALSE)); ASSERT(AfxIsValidAddress(lpStgMedium, sizeof(STGMEDIUM))); BOOL bGetDataHere = (lpStgMedium->tymed != TYMED_NULL); // Allow IStream or IStorage as the storage medium. if (!(lpFormatEtc->tymed & (TYMED_ISTREAM|TYMED_ISTORAGE))) { TRACE0("Propset only supported for stream or storage.\n"); return FALSE; } LPSTORAGE lpStorage = NULL; LPSTREAM lpStream = NULL; if (lpFormatEtc->tymed & TYMED_ISTORAGE) { // Caller wants propset data in a storage object. if (bGetDataHere) { // Use the caller-supplied storage object. lpStorage = lpStgMedium->pstg; } else { // Create a storage object on a memory ILockBytes implementation. LPLOCKBYTES lpLockBytes = NULL; if (FAILED(CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes))) { TRACE0("CreateILockBytesOnHGlobal failed.\n"); return FALSE; } ASSERT_POINTER(lpLockBytes, ILockBytes); if (FAILED(StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage))) { TRACE0("StgCreateDocfileOnILockBytes failed.\n"); lpLockBytes->Release(); return FALSE; } // Docfile now has reference to ILockBytes, so release ours. lpLockBytes->Release(); } ASSERT_POINTER(lpStorage, IStorage); // Create a stream within the storage. if (FAILED(lpStorage->CreateStream(OLESTR("Contents"), STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, 0, &lpStream))) { TRACE0("IStorage::CreateStream failed.\n"); if (!bGetDataHere) lpStorage->Release(); return FALSE; } } else { // Caller wants propset data in a stream object. if (bGetDataHere) { // Use the caller-supplied stream object lpStream = lpStgMedium->pstm; } else { lpStream = _AfxCreateMemoryStream(); if (lpStream == NULL) return FALSE; } } ASSERT_POINTER(lpStream, IStream); // Create the property set. CLSID clsid; GetClassID(&clsid); CPropertySet pset(clsid); pset.SetOSVersion(MAKELONG(LOWORD(GetVersion()), OSTYPE)); CPropertySection* ppsec = pset.AddSection(fmtid); if (ppsec == NULL) { TRACE0("CPropertySet::AddSection failed.\n"); lpStream->Release(); lpStorage->Release(); return FALSE; } // Set the name, based on the ambient display name (from the container). ppsec->SetSectionName(AmbientDisplayName()); CPropsetPropExchange propx(*ppsec, lpStorage, FALSE); BOOL bPropExchange = FALSE; TRY { DoPropExchange(&propx); bPropExchange = TRUE; } END_TRY if (!bPropExchange) { TRACE0("DoPropExchange failed.\n"); lpStream->Release(); lpStorage->Release(); return FALSE; } // Store the property set in the stream. if (FAILED(pset.WriteToStream(lpStream))) { TRACE0("CPropertySet::WriteToStream failed.\n"); lpStream->Release(); lpStorage->Release(); return FALSE; } // Return the property set in the requested medium. if (lpFormatEtc->tymed & TYMED_ISTORAGE) { // Return as a storage object. ASSERT_POINTER(lpStorage, IStorage); lpStream->Release(); lpStgMedium->pstg = lpStorage; lpStgMedium->tymed = TYMED_ISTORAGE; lpStgMedium->pUnkForRelease = NULL; } else { // Return as a stream. ASSERT_POINTER(lpStream, IStream); lpStgMedium->pstm = lpStream; lpStgMedium->tymed = TYMED_ISTREAM; lpStgMedium->pUnkForRelease = NULL; } return TRUE; }
void UIIMEdit::InsertImage(BSTR bstrFileName,SIZE size,BOOL isGif) { LPSTORAGE lpStorage = NULL; LPOLEOBJECT lpObject = NULL; LPLOCKBYTES lpLockBytes = NULL; LPOLECLIENTSITE lpClientSite = NULL; GifSmiley::IGifSmileyCtrl* lpAnimator = nullptr; HRESULT hr = ::CoCreateInstance(GifSmiley::CLSID_CGifSmileyCtrl, NULL, CLSCTX_INPROC, GifSmiley::IID_IGifSmileyCtrl, (LPVOID*)&lpAnimator); if (NULL == lpAnimator || FAILED(hr)) { LOG__(ERR, _T("InsertImage CoCreateInstance failed")); goto End; } COLORREF backColor = (COLORREF)(::GetSysColor(COLOR_WINDOW)); HWND hwnd = (HWND)((long)m_pManager->GetPaintWindow()); IRichEditOle *pRichEditOle = m_pRichEditOle; if (NULL == pRichEditOle) goto End; BSTR path = NULL; //Create lockbytes hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); if (FAILED(hr)) { LOG__(ERR, _T("InsertImage CreateILockBytesOnHGlobal failed")); goto End; } //use lockbytes to create storage SCODE sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &lpStorage); if (sc != S_OK) { LOG__(ERR, _T("InsertImage StgCreateDocfileOnILockBytes failed")); goto End; } // retrieve OLE interface for richedit and Get site pRichEditOle->GetClientSite(&lpClientSite); try { //COM operation need BSTR, so get a BSTR path = bstrFileName; //Load the image if (isGif) lpAnimator->LoadFromFile(path); else { UInt32 height = (size.cy < GetHeight()) ? size.cy : GetHeight(); UInt32 width = (size.cx < GetWidth() / 2) ? size.cx : GetWidth() / 2; lpAnimator->LoadFromFileSized(path, width, height); } //Set back color OLE_COLOR oleBackColor = (OLE_COLOR)backColor; lpAnimator->put_BackColor(oleBackColor); //get the IOleObject hr = lpAnimator->QueryInterface(IID_IOleObject, (void**)&lpObject); if (FAILED(hr)) { LOG__(ERR, _T("InsertImage lpAnimator QueryInterface failed")); goto End; } //Set it to be inserted OleSetContainedObject(lpObject, TRUE); //to insert into richedit, you need a struct of REOBJECT REOBJECT reobject; ZeroMemory(&reobject, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); CLSID clsid; hr = lpObject->GetUserClassID(&clsid); //set clsid reobject.clsid = clsid; //can be selected reobject.cp = REO_CP_SELECTION; //content, but not static reobject.dvaspect = DVASPECT_CONTENT; //goes in the same line of text line reobject.dwFlags = REO_BELOWBASELINE; //reobject.dwUser = (DWORD)myObject; //the very object reobject.poleobj = lpObject; //client site contain the object reobject.polesite = lpClientSite; //the storage reobject.pstg = lpStorage; SIZEL sizel = { 0 }; reobject.sizel = sizel; LPOLECLIENTSITE lpObjectClientSite = NULL; hr = lpObject->GetClientSite(&lpObjectClientSite); if (FAILED(hr) || lpObjectClientSite == NULL) lpObject->SetClientSite(lpClientSite); pRichEditOle->InsertObject(&reobject); //redraw the window to show animation ::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); } catch (...) { LOG__(ERR, _T("InsertImage unknown exeption")); } End: if (lpClientSite) { lpClientSite->Release(); lpClientSite = nullptr; } if (lpObject) { lpObject->Release(); lpObject = nullptr; } if (lpLockBytes) { lpLockBytes->Release(); lpLockBytes = nullptr; } if (lpStorage) { lpStorage->Release(); lpStorage = nullptr; } if (lpAnimator) { lpAnimator->Release(); lpAnimator = nullptr; } }
void App::GetProperties() { LPSTORAGE pStorage = NULL; IPropertySetStorage* pPropertySetStorage = NULL; IPropertyStorage* pSummaryInfoStorage = NULL; IPropertyStorage* pDocumentSummaryInfoStorage = NULL; IPropertyStorage* pUserDefinedPropertyStorage = NULL; wchar_t wfilename[_MAX_PATH]; char szBuf[256]; char filename[MAX_PATH]; SendMessage(GetDlgItem(hPropDialog, IDC_TITLE), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_SUBJECT), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_AUTHOR), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_MANAGER), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_COMPANY), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_CATEGORY), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_KEYWORDS), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_COMMENTS), WM_SETTEXT, 0, (LPARAM)""); SendMessage(GetDlgItem(hPropDialog, IDC_CONTENTS), LB_RESETCONTENT, 0, 0); ListView_DeleteAllItems(GetDlgItem(hPropDialog, IDC_CUSTOM)); int idx = SendMessage(hListBox, LB_GETCURSEL, 0, 0); SendMessage(hListBox, LB_GETTEXT, idx, (LPARAM)filename); SetWindowText(hPropDialog, filename); MultiByteToWideChar(CP_ACP, 0, filename, -1, wfilename, _MAX_PATH); HRESULT res = StgOpenStorage(wfilename, (LPSTORAGE)0, STGM_DIRECT|STGM_READ|STGM_SHARE_EXCLUSIVE, NULL,0,&pStorage); if (res!=S_OK) { return; } // Get the Storage interface if (S_OK != pStorage->QueryInterface(IID_IPropertySetStorage, (void**)&pPropertySetStorage)) { pStorage->Release(); return; } // Get the SummaryInfo property set interface if (S_OK == pPropertySetStorage->Open(FMTID_SummaryInformation, STGM_READ|STGM_SHARE_EXCLUSIVE, &pSummaryInfoStorage)) { BOOL bFound = FALSE; PROPSPEC PropSpec[5]; PROPVARIANT PropVar[5]; PropSpec[0].ulKind = PRSPEC_PROPID; PropSpec[0].propid = PID_TITLE; PropSpec[1].ulKind = PRSPEC_PROPID; PropSpec[1].propid = PID_SUBJECT; PropSpec[2].ulKind = PRSPEC_PROPID; PropSpec[2].propid = PID_AUTHOR; PropSpec[3].ulKind = PRSPEC_PROPID; PropSpec[3].propid = PID_KEYWORDS; PropSpec[4].ulKind = PRSPEC_PROPID; PropSpec[4].propid = PID_COMMENTS; HRESULT hr = pSummaryInfoStorage->ReadMultiple(5, PropSpec, PropVar); if (S_OK == hr) { if (PropVar[0].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_TITLE), WM_SETTEXT, 0, (LPARAM)PropVar[0].pszVal); } if (PropVar[1].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_SUBJECT), WM_SETTEXT, 0, (LPARAM)PropVar[1].pszVal); } if (PropVar[2].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_AUTHOR), WM_SETTEXT, 0, (LPARAM)PropVar[2].pszVal); } if (PropVar[3].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_KEYWORDS), WM_SETTEXT, 0, (LPARAM)PropVar[3].pszVal); } if (PropVar[4].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_COMMENTS), WM_SETTEXT, 0, (LPARAM)PropVar[4].pszVal); } } FreePropVariantArray(5, PropVar); pSummaryInfoStorage->Release(); } // Get the DocumentSummaryInfo property set interface if (S_OK == pPropertySetStorage->Open(FMTID_DocSummaryInformation, STGM_READ|STGM_SHARE_EXCLUSIVE, &pDocumentSummaryInfoStorage)) { BOOL bFound = FALSE; PROPSPEC PropSpec[5]; PROPVARIANT PropVar[5]; PropSpec[0].ulKind = PRSPEC_PROPID; PropSpec[0].propid = PID_MANAGER; PropSpec[1].ulKind = PRSPEC_PROPID; PropSpec[1].propid = PID_COMPANY; PropSpec[2].ulKind = PRSPEC_PROPID; PropSpec[2].propid = PID_CATEGORY; PropSpec[3].ulKind = PRSPEC_PROPID; PropSpec[3].propid = PID_HEADINGPAIR; PropSpec[4].ulKind = PRSPEC_PROPID; PropSpec[4].propid = PID_DOCPARTS; HRESULT hr = pDocumentSummaryInfoStorage->ReadMultiple(5, PropSpec, PropVar); if (S_OK == hr) { if (PropVar[0].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_MANAGER), WM_SETTEXT, 0, (LPARAM)PropVar[0].pszVal); } if (PropVar[1].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_COMPANY), WM_SETTEXT, 0, (LPARAM)PropVar[1].pszVal); } if (PropVar[2].vt == VT_LPSTR) { SendMessage(GetDlgItem(hPropDialog, IDC_CATEGORY), WM_SETTEXT, 0, (LPARAM)PropVar[2].pszVal); } if ((PropVar[3].vt == (VT_VARIANT | VT_VECTOR)) && (PropVar[4].vt == (VT_LPSTR | VT_VECTOR))) { CAPROPVARIANT* pHeading = &PropVar[3].capropvar; CALPSTR* pDocPart = &PropVar[4].calpstr; // Headings: // ========= // 0 - General // 2 - Mesh Totals // 4 - Scene Totals // 6 - External Dependencies // 8 - Objects // 10 - Materials // 12 - Plug-Ins int nDocPart = 0; for (UINT i=0; i<pHeading->cElems; i+=2) { SendMessage(GetDlgItem(hPropDialog, IDC_CONTENTS), LB_ADDSTRING, 0, (LPARAM)pHeading->pElems[i].pszVal); for (int j=0; j<pHeading->pElems[i+1].lVal; j++) { sprintf(szBuf, "\t%s", pDocPart->pElems[nDocPart]); SendMessage(GetDlgItem(hPropDialog, IDC_CONTENTS), LB_ADDSTRING, 0, (LPARAM)szBuf); nDocPart++; } } } } FreePropVariantArray(5, PropVar); pDocumentSummaryInfoStorage->Release(); } if (S_OK == pPropertySetStorage->Open(FMTID_UserDefinedProperties, STGM_READ|STGM_SHARE_EXCLUSIVE, &pUserDefinedPropertyStorage)) { int numUserProps = 0; // First we need to count the properties IEnumSTATPROPSTG* pIPropertyEnum; if (S_OK == pUserDefinedPropertyStorage->Enum(&pIPropertyEnum)) { STATPROPSTG property; while (pIPropertyEnum->Next(1, &property, NULL) == S_OK) { if (property.lpwstrName) { CoTaskMemFree(property.lpwstrName); property.lpwstrName = NULL; numUserProps++; } } PROPSPEC* pPropSpec = new PROPSPEC[numUserProps]; PROPVARIANT* pPropVar = new PROPVARIANT[numUserProps]; ZeroMemory(pPropVar, numUserProps*sizeof(PROPVARIANT)); ZeroMemory(pPropSpec, numUserProps*sizeof(PROPSPEC)); pIPropertyEnum->Reset(); int idx = 0; while (pIPropertyEnum->Next(1, &property, NULL) == S_OK) { if (property.lpwstrName) { pPropSpec[idx].ulKind = PRSPEC_LPWSTR; pPropSpec[idx].lpwstr = (LPWSTR)CoTaskMemAlloc(sizeof(wchar_t)*(wcslen(property.lpwstrName)+1)); wcscpy(pPropSpec[idx].lpwstr, property.lpwstrName); idx++; CoTaskMemFree(property.lpwstrName); property.lpwstrName = NULL; } } pIPropertyEnum->Release(); ListView_DeleteAllItems(GetDlgItem(hPropDialog, IDC_CUSTOM)); HRESULT hr = pUserDefinedPropertyStorage->ReadMultiple(idx, pPropSpec, pPropVar); if (S_OK == hr) { for (int i=0; i<idx; i++) { wcstombs(szBuf, pPropSpec[i].lpwstr, 255); LV_ITEM item; item.mask = LVIF_TEXT; item.iItem = i; item.iSubItem = 0; item.pszText = szBuf; item.cchTextMax = strlen(szBuf); ListView_InsertItem(GetDlgItem(hPropDialog, IDC_CUSTOM), &item); VariantToString(this, &pPropVar[i], szBuf, 255); item.iSubItem = 1; item.pszText = szBuf; item.cchTextMax = strlen(szBuf); ListView_SetItem(GetDlgItem(hPropDialog, IDC_CUSTOM), &item); TypeNameFromVariant(this, &pPropVar[i], szBuf, 255); item.iSubItem = 2; item.pszText = szBuf; item.cchTextMax = strlen(szBuf); ListView_SetItem(GetDlgItem(hPropDialog, IDC_CUSTOM), &item); } } for (int i=0; i<idx; i++) { CoTaskMemFree(pPropSpec[i].lpwstr); } FreePropVariantArray(numUserProps, pPropVar); delete [] pPropSpec; delete [] pPropVar; } pUserDefinedPropertyStorage->Release(); } pPropertySetStorage->Release(); pStorage->Release(); }
BOOL COleDocument::OnSaveDocument(LPCTSTR lpszPathName) // lpszPathName must be fully qualified { ASSERT(lpszPathName == NULL || AfxIsValidString(lpszPathName)); // use default implementation if 'docfile' not enabled if (!m_bCompoundFile && m_lpRootStg == NULL) { ASSERT(lpszPathName != NULL); return CDocument::OnSaveDocument(lpszPathName); } LPSTORAGE lpOrigStg = NULL; if (lpszPathName != NULL) m_bSameAsLoad = AfxComparePath(m_strPathName, lpszPathName); BOOL bResult = FALSE; TRY { // open new root storage if necessary if (lpszPathName != NULL && !m_bSameAsLoad) { // temporarily detach current storage lpOrigStg = m_lpRootStg; m_lpRootStg = NULL; LPSTORAGE lpStorage; const CStringW strPathName(lpszPathName); SCODE sc = ::StgCreateDocfile(strPathName.GetString(), STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_DENY_WRITE|STGM_CREATE, 0, &lpStorage); if (sc != S_OK) AfxThrowOleException(sc); ASSERT(lpStorage != NULL); m_lpRootStg = lpStorage; } ASSERT(m_lpRootStg != NULL); // use helper to save to root storage SaveToStorage(); if (lpszPathName != NULL) { // commit each of the items CommitItems(m_bRemember && !m_bSameAsLoad); // mark document as clean if remembering the storage if (m_bRemember) SetModifiedFlag(FALSE); // remember correct storage or release save copy as storage if (!m_bSameAsLoad) { if (m_bRemember) { // Save As case -- m_stgRoot is new storage, forget old storage lpOrigStg->Release(); } else { // Save Copy As case -- m_stgRoot should hook up to m_stgOrig. m_lpRootStg->Release(); m_lpRootStg = lpOrigStg; } } } bResult = TRUE; } CATCH_ALL(e) { if (lpOrigStg != NULL) { // save as failed: abort new storage, and re-attach original RELEASE(m_lpRootStg); m_lpRootStg = lpOrigStg; } if (lpszPathName == NULL) { THROW_LAST(); } TRY { ReportSaveLoadException(lpszPathName, e, TRUE, AFX_IDP_FAILED_TO_SAVE_DOC); } END_TRY DELETE_EXCEPTION(e); } END_CATCH_ALL // cleanup m_bSameAsLoad = TRUE; m_bRemember = TRUE; return bResult; }