// Erzeugen eines BYTE-Blobs aus einem Koordinatenfeld HRESULT CreateBlobFromVertices ( unsigned long ulCnt, double_i itx, double_i ity, POINTBASE *pNormal, void *pData, REFCLSID rClsId, void **ppBlob, unsigned long *plSize) { if (NULL == ppBlob || NULL == plSize) return E_POINTER; BYTE *pNewData = NULL; COM_TRY { // resultierende Größe feststellen unsigned long ulSize = 0; CBlobService MakeBlobs; THROW_FAILED_HRESULT(MakeBlobs.GetBlobSize (rClsId, ulCnt, pData, &ulSize)); // SAFEARRAY anlegen und Daten übernehmen pNewData = (BYTE *)::CoTaskMemAlloc (ulSize); if (NULL == pNewData) _com_issue_error(E_OUTOFMEMORY); THROW_FAILED_HRESULT(MakeBlobs.MakeBlob (rClsId, ulCnt, itx, ity, pNormal, pData, pNewData)); // Ergebnisse liefern *ppBlob = pNewData; *plSize = ulSize; } COM_CATCH_OP(::CoTaskMemFree(pNewData)); return S_OK; }
/////////////////////////////////////////////////////////////////////////////// // alle Objekte eines Bereiches suchen HRESULT CSpatialTree::TreeNodeSearch ( double *padfBoundsMin, double *padfBoundsMax, HRESULT (CALLBACK *pFcn)(_DGMGeometry *, UINT_PTR), UINT_PTR dwData, bool fExact) { // Perform the search for likely candidates. These are shapes // that fall into a tree node whose bounding box intersects our // area of interest. int nFeatureCount = 0; _DGMGeometry * *panHits = FindLikelyFeatures (padfBoundsMin, padfBoundsMax, &nFeatureCount); if (NULL == panHits) return S_OK; // nothing found // Read all of these shapes, and establish whether the shape's // bounding box actually intersects the area of interest. Note // that the bounding box could intersect the area of interest, // and the shape itself still not cross it but we don't try to // address that here. HRESULT hr = S_OK; COM_TRY { for (int i = 0; i < nFeatureCount && SUCCEEDED(hr); ++i) { W_DGMGeometry Object (panHits[i]); if (!Object) continue; WTRiASCSGeometryProperties Prop (Object); WTRiASSimpleRectangle Rect; double dBoundsMin[2]; double dBoundsMax[2]; THROW_FAILED_HRESULT(Prop -> get_Envelope(Rect.ppi())); THROW_FAILED_HRESULT(Rect -> GetRect(&dBoundsMin[0], &dBoundsMin[1], &dBoundsMax[0], &dBoundsMax[1])); if (CSpatialTreeNode::CheckBoundsOverlap (padfBoundsMin, padfBoundsMax, dBoundsMin, dBoundsMax)) { if (!fExact || S_OK == CheckRealOverlap (Object, padfBoundsMin, padfBoundsMax)) hr = pFcn (Object, dwData); } } } COM_CATCH_OP(free (panHits)); free (panHits); return hr; }
HRESULT CTRiASDropTarget::InitFileExtensionList (REFGUID rGuid) { LPOLESTR poleStr = NULL; USES_CONVERSION; COM_TRY { // DBEngine instantiieren und nach EnumString fragen WTRiASDBEngine DBEng; WUnknown Unk; HRESULT hr = DBEng.CreateInstance(rGuid); if (FAILED(hr)) return hr; // ggf. nicht instantiierbar (z.B. lizensiert) THROW_FAILED_HRESULT(DBEng -> EnumDataBaseTypes (Unk.ppi())); // jetzt eigentliche Dataserver einfügen WEnumString EnumStr(Unk); for (EnumStr -> Reset(); S_OK == EnumStr -> Next (1, &poleStr, NULL); /**/) { CConnectParams Item; DWORD dwDummy = 0; HRESULT hr = TxGetExtension() -> ReadDataServerParams (dwDummy, &Item, OLE2A(poleStr)); CoTaskMemFree (poleStr); poleStr = NULL; // nur dateibasierte Datenquelle untersuchen if (!Item.m_fNameIsFile) continue; m_lstExts.insert(CExtensions::value_type(os_string(Item.m_strDefExt), Item)); } } COM_CATCH_OP(CoTaskMemFree (poleStr)); return S_OK; }
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; }