예제 #1
0
// 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;
}
예제 #2
0
///////////////////////////////////////////////////////////////////////////////
// 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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}