// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::BeginAction (IProgressIndicator* pIProgInd) { #if _TRiAS_VER < 0x0300 m_hPr = 0; #else COM_TRY { // Zieldatenquelle aus KontextObjekt herausfinden WPropertyActionSequence wSeq; WDataObject CtxDO; CComVariant vData; m_hPr = 0; THROW_FAILED_HRESULT (GetSite (IID_IPropertyActionSequence, wSeq.ppv())); THROW_FAILED_HRESULT (wSeq->GetSequenceContext (CtxDO.ppi())); if (SUCCEEDED (GetVariantData (CtxDO, &c_feDataSourceHandle, &vData)) && SUCCEEDED (vData.ChangeType (VT_I4))) { m_hPr = reinterpret_cast<HPROJECT>(V_I4(&vData)); } } COM_CATCH; #endif // _TRiAS_VER < 0x0300 // Zustand des Dialogs retten (für evtl. späteres Save()) m_pRegOperDlg->GetSelectedInfo (&m_caSelInfo, m_bIsDirty); // Liste für Objekte, die an die PropertyPage übergeben werden, initialisieren m_InObjs.clear(); // Liste sicher leeren m_ObjsIter = m_InObjs.begin(); // auf Anfang stellen return S_OK; } // BeginAction
// ---------------------------------------------------------------------------- // PropertySequence_refcnt // ---------------------------------------------------------------------------- void PropertySequence_refcnt (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs) { BASIC_OP_TRACE_SYS(PropertySequence_refcnt); switch (iNumArgs) { case OBJECT_REFNEW: { ebSetObject (lpArgs, 0, NULL); // für alle Fälle try { WPropertyActionSequence PropSeq (CLSID_PropertyActionSequence); // throws hr HPROJECT hPrCtx = reinterpret_cast<HPROJECT>(ebThread_GetLong (hThread, SETLONG_HPROJECT)); // Kontext-Datenquelle ebSetObject (lpArgs, 0, (DWORD)PropSeq.detach()); if (HACTCONNECTION != hPrCtx) { WDataObject CtxDO; CComVariant vData (reinterpret_cast<long>(hPrCtx), VT_I4); THROW_FAILED_HRESULT(PropSeq -> GetSequenceContext (CtxDO.ppi())); THROW_FAILED_HRESULT(SetVariantData (vData, CtxDO, &c_feDataSourceHandle)); } } catch (...) { TRACE("Couldn't instantiate PropertyActionSequence\r\n"); } } break; case OBJECT_REFINC: ((IUnknown *)ebGetObject(lpArgs, 1)) -> AddRef(); break; case OBJECT_REFDEC: ((IUnknown *)ebGetObject(lpArgs, 1)) -> Release(); break; } }
// ---------------------------------------------------------------------------- // PropertySequence_cmd_RedoActions // ---------------------------------------------------------------------------- void PropertySequence_cmd_RedoActions (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs) { BASIC_OP_TRACE(PropertySequence_cmd_RedoActions); WPropertyActionSequence Seq ((IPropertyActionSequence *)ebGetObject (lpArgs, 1)); WDataObject InData; _DGeoObjects *pIObjs = iNumArgs > 1 ? (_DGeoObjects *)ebGetObject (lpArgs, 2) : NULL; HRESULT hr = NOERROR; if (NULL != pIObjs) { WEnumLONG EnumObjs; hr = GetEnumLongFromGeoObjects (pIObjs, EnumObjs.ppi()); if (SUCCEEDED(hr)) { hr = CoCreateInstance (CLSID_DataTransferObject, NULL, CLSCTX_INPROC_SERVER, IID_IDataObject, InData.ppv()); if (SUCCEEDED(hr)) hr = SetEnumLONGData (EnumObjs, InData); else InData.Assign (NULL); // freigeben } pIObjs = NULL; // wird nicht mehr benötigt } Seq -> RedoActions (__hWndM, NULL, InData, NULL); }
// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; try { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (SUCCEEDED(EnsureOptionsIF())) { _ASSERTE(m_wOperOptions.IsValid()); m_wOperOptions->GetOptions (&dwOptions); } // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pRegOperDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ( (IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT1, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } catch (_com_error& hr_result) // 23.09.99 { DELETE_OBJ (m_pRegOperDlg); // bei Fehler Dialog wieder freigeben return _COM_ERROR(hr_result); // 23.09.99 } if (m_ObjsIter != m_InObjs.end()) // es kommen noch weitere Daten return S_FALSE; DELETE_OBJ (m_pRegOperDlg); // es kommen keine Daten mehr return S_OK; } // EndAction
// -------------------------------------------------------------------------------------------- STDMETHODIMP CAreaBuildPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; COM_TRY { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (m_wOperOptions.IsValid()) m_wOperOptions->GetOptions (&dwOptions); // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pAreaBuildDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ((IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT7, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } COM_CATCH_OP( delete m_pAreaBuildDlg; // bei Fehler Dialog wieder freigeben );
STDMETHODIMP CTextSearchEngine::EndAction (DWORD, IDataObject **ppDataObj) { if (NULL == m_pCfgDlg) return E_UNEXPECTED; if (NULL == ppDataObj) return E_POINTER; *ppDataObj = NULL; COM_TRY { // DataObject generieren und mit EnumObj füllen WEnumLONG EnumObj; THROW_FAILED_HRESULT(m_pCfgDlg -> GetEnumLONG (EnumObj.ppi())); WDataObject IDO (CLSID_DataTransferObject); THROW_FAILED_HRESULT(SetEnumLONGData (EnumObj, IDO)); *ppDataObj = IDO.detach(); } COM_CATCH_OP((delete m_pCfgDlg, m_pCfgDlg = NULL)); // rechercvhe liefert immer nur eine Objektmenge DELETE_OBJ(m_pCfgDlg); // Dialog wird nicht mehr gebraucht return S_OK; }