예제 #1
0
// Besorgen des Tabellennamens (sofern einer exitiert)
HRESULT DatenBasisObjekt::GetTableName (TABLENAME *pTableName)
{
// Rückgabewerte initialisieren
int iLen = pTableName -> iLen;

	pTableName -> pBuffer[0] = '\0';
	pTableName -> iLen = 0;

// Objektmenge aus globaler Tabelle lesen
WTRiASObjects Objs;
HRESULT hr = S_OK;

	if (FAILED(hr = GetObjectsFromMap (pTableName -> lIdent, Objs)))
		return hr;

CComBSTR bstrName;

	RETURN_FAILED_HRESULT(hr = Objs -> get_TableName (CLEARED(&bstrName)));

int iToCopy = min ((int)bstrName.Length(), iLen -1);

	USES_CONVERSION;
	strncpy (pTableName -> pBuffer, OLE2A(bstrName), iToCopy);
	pTableName -> pBuffer[iToCopy] = '\0';
	pTableName -> iLen = iToCopy;

	return hr;
}
예제 #2
0
	bool operator()( WTRiASCS cs ) 
	{
	CComBSTR strDescription;

		cs->get_Description( CLEARED(strDescription) );
		return strDescription == m_strSearch;
	}
예제 #3
0
IMPLEMENT_DEBUG_FUNCENTRY_4(CGDODatabase,get_ObjectsDef,VARIANT, vIndex, VARIANT_BOOL, fCreate, BSTR, Type, ITRiASObjects**, ppIObjectsDef) 
{
	CHECKOUTPOINTER(ppIObjectsDef);
	COM_TRY {
		CHECK_INITIALIZED();

	WTRiASObjects	pTRiASObjects;
	CComVariant	vItem;

		RETURN_FAILED_HRESULT(EnsureObjectsColl());
	
	HRESULT hr = m_pGDOObjectsCollection -> Item (vIndex, CLEARED(vItem));

		if (SUCCEEDED(hr)) 
			pTRiASObjects = V_DISPATCH(&vItem);
		else if (TRIASDB_E_UNKNOWN_OBJECTS == hr && fCreate) {
		WTRiASObjectsCollection	pTRiASObjectsCollection;
		
			ERROR_FAILED_HRESULT(m_pGDOObjectsCollection -> QueryInterface (pTRiASObjectsCollection.ppi()), E_FAIL);
			ERROR_FAILED_HRESULT(pTRiASObjectsCollection -> Add (V_BSTR(&vIndex), Type, pTRiASObjects.ppi()), E_FAIL);
		} else 
			return hr;

		*ppIObjectsDef = pTRiASObjects.detach();
	} COM_CATCH;
	return S_OK;
}
예제 #4
0
HRESULT CFastdbFeature::OnChangedName()
{
	USES_CONVERSION;
	COM_TRY {
	// neuen Namen vom Bezugsobjekt besorgen
	CComBSTR bstrName;
	WTRiASFeature BaseFeat;

		THROW_FAILED_HRESULT(m_BaseUnk -> QueryInterface (BaseFeat.ppi()));
		THROW_FAILED_HRESULT(BaseFeat -> get_Name(CLEARED(&bstrName)))

	// zugehöriges DB-Objekt referenzieren
	LONG lCursor (GetPropertyFrom (BaseFeat, g_cbFeatureCursor, 0L));

		if (0 != lCursor) {	// Objekt fertig initialisiert
		dbCursor<CDBFeatureDesc> cursor (GetRelatedDatabase(GetUnknown()), dbCursorForUpdate);
		CDBFeatureDesc *pFeatDesc = cursor.at (dbReference<CDBFeatureDesc>(oid_t(lCursor)));

			if (NULL == pFeatDesc || cursor.isEmpty())
				THROW_FAILED_HRESULT(FASTDB_E_FEATURE_BADREFERENCE);

			cursor -> m_pName = OLE2A(bstrName);
			cursor.update();
		}

	} COM_CATCH;
	return S_OK;
}
예제 #5
0
STDMETHODIMP COleObjectPropertyDual::HelpInfo (
	LPSTR pBuffer, ULONG ulLen, LPSTR pHelpFile, ULONG *pulHelpCtx)
{
HRESULT result = S_OK;

	try {
	CComBSTR bstrInfo;
	CComVariant vHelpFile;
	CComVariant vHelpCtx;

		THROW_FAILED_HRESULT(m_ObjProp -> HelpInfo(&vHelpFile, &vHelpCtx, CLEARED(&bstrInfo)));

		USES_CONVERSION;
		if (NULL != pBuffer && ulLen > 0) {
		ULONG ulT = min (ulLen-1, (ULONG)SysStringLen(bstrInfo));

			strncpy (pBuffer, OLE2A(bstrInfo), ulT);
			pBuffer[ulT] = '\0';
		}
		if (NULL != pHelpFile && VT_BSTR == vHelpFile.vt) 
			strcpy (pHelpFile, OLE2A(V_BSTR(&vHelpFile)));

		if (NULL != pulHelpCtx && VT_I4 == vHelpCtx.vt) 
			*pulHelpCtx = V_I4(&vHelpCtx);

	} catch (_com_error& hr) {
		result = _COM_ERROR(hr);
	}

	return result;
}
예제 #6
0
///////////////////////////////////////////////////////////////////////////////
// aus TRiASCS Wkt erzeugen
STDMETHODIMP CTRiASCSWktService::ExportAsWkt(WKTFORMAT rgFormat, ITRiASCS *pCS, BSTR *pbstrWktCS)
{
    CHECKOUTPOINTER(pbstrWktCS);
    CHECKINPOINTER(pCS);

    if (WKTFORMAT_OgcWkt != rgFormat)
        return E_INVALIDARG;

    COM_TRY {
        // ist's einprojektives System
        CComBSTR bstrWkt;
        CComBSTR bstr;
        TRIASCSTYPE rgType;
        WTRiASCSPCS PCS;

        THROW_FAILED_HRESULT(pCS -> get_CoordSystemType(&rgType));
        if (tcsCS_Projected == rgType) {
            bstrWkt.Append(L"PROJCS[\"");

            // Namen der Projektion ausgeben
            THROW_FAILED_HRESULT(RetrieveProjectedName (pCS, CLEARED(&bstr)));
            bstrWkt.Append(bstr);
        }

        // Datumsbeschreibung ausgeben
        WTRiASCSGCS GCS;

        THROW_FAILED_HRESULT(pCS -> get_GeographicCS(GCS.ppi()));
        THROW_FAILED_HRESULT(ExportGeographicSystem(GCS, CLEARED(&bstr)));
        bstrWkt.Append(bstr);

        // ggf. Projektionsparameter ausgeben
        if (tcsCS_Projected == rgType) {
            _ASSERTE(PCS.IsValid());

            THROW_FAILED_HRESULT(ExportProjectionParams(PCS, CLEARED(&bstr)));
            bstrWkt.Append(bstr);
            bstrWkt.Append(L"]");
        }

        // Resultat liefern
        *pbstrWktCS = bstrWkt.Detach();

    } COM_CATCH;
    return S_OK;
}
예제 #7
0
HRESULT COpenNewPropertySheet::HandleConnectString (void)
{
	if (!m_ExtPages && !m_Pairs)
		return S_FALSE;
	USES_CONVERSION;

CComBSTR bstrPairs;

	RETURN_FAILED_HRESULT(m_Pairs -> get_ComposedData (CComBSTR(g_cbPattern), CLEARED(&bstrPairs)));
	m_Params.m_strConnect = OLE2A(bstrPairs);
	return S_OK;
}
예제 #8
0
BOOL DatenBasisObjekt::EnumPBDDataIdent (HPROJECT hPr, ENUMLONGKEYPROC pFcn, void *pData)
{
	TX_ASSERT(IsTRiASDBBased());

BOOL iRC = TRUE;

	COM_TRY {
	// Enumerieren aller Objektklassen einer Datenquelle
		if (HACTPROJECT != hPr) {
			if (HACTCONNECTION != hPr)	// eine bestimmte Datenquelle auswerten
				return DB(hPr).EnumPBDDataIdent (pFcn, pData);

		// _alle_ Datenquellen auswerten
		CRing r (*m_pGeoDBs);

			for (r.First(); r.Valid(); r.Next()) {
			GeoDBLock l(r);

				TX_ASSERT(NULL != (GeoDB *)l);
				if (l -> isOpened()) {
					if (!l -> EnumPBDDataIdent (pFcn, pData))
						return FALSE;
				}
			}
			return TRUE;
		}

	// Objektmengen (Tabellen) enumerieren
	WTRiASObjectsCollection ObjsDefs;

		THROW_FAILED_HRESULT(m_Prj -> get_ObjectsDefs (ObjsDefs.ppi()));

	WEnumVARIANT Enum;
	CComVariant v;

		THROW_FAILED_HRESULT(ObjsDefs -> _NewEnum (Enum.ppu()));
		for (Enum -> Reset(); S_OK == Enum -> Next (1, CLEARED(&v), NULL); /**/) 
		{
			if (FAILED(v.ChangeType (VT_DISPATCH)))
				continue;

		WTRiASObjects Item (V_DISPATCH(&v));
		INT_PTR lHandle = 0L;

			if (SUCCEEDED(Item -> get_Handle (&lHandle))) {
				iRC = EnumIdentsCallback (pFcn, lHandle, TRUE, pData);
				if (!iRC) break;	// Enumeration abgebrochen
			}
		}

	} COM_CATCH_RETURN(FALSE);
	return iRC;
}
예제 #9
0
STDMETHODIMP COleObjectPropertyDual::GetPropInfo (LPSTR pBuffer, WORD wLen, DWORD *pdwFlags)
{
HRESULT result = S_OK;

	try {
	// get_PropertyName
		if (NULL != pBuffer && wLen > 0) {
		CComBSTR bstrName;

			THROW_FAILED_HRESULT(m_ObjProp -> get_PropertyName(CLEARED(&bstrName)));

		ULONG ulT = min ((ULONG)wLen-1, (ULONG)SysStringLen(bstrName));

			USES_CONVERSION;
			strncpy (pBuffer, OLE2A(bstrName), ulT);
			pBuffer[ulT] = '\0';
		}
			
	} catch (_com_error& hr) {
		return _COM_ERROR(hr);
	} 

	try {
	PROPERTYCAPS lFlags = PROPERTYCAPS_NONE;

	// get_PropertyFlags
		if (NULL != pdwFlags) {
			THROW_FAILED_HRESULT(m_ObjProp -> get_PropertyFlags(&lFlags));
			
			if (m_fWriteAble)
				lFlags = PROPERTYCAPS(lFlags | PROPERTYCAPS_NOTREADONLY);
			else
				lFlags = PROPERTYCAPS(lFlags & ~PROPERTYCAPS_NOTREADONLY);
			
			if (m_fSearchAble)
				lFlags = PROPERTYCAPS(lFlags | PROPERTYCAPS_SEARCHABLE);
			else
				lFlags = PROPERTYCAPS(lFlags & ~PROPERTYCAPS_SEARCHABLE);

			*pdwFlags = DWORD(lFlags);
		}
			
	} catch (_com_error&) {
		*pdwFlags = DWORD(PROPERTYCAPS_NONE);
		if (m_fWriteAble)
			*pdwFlags |= DWORD(PROPERTYCAPS_NOTREADONLY);
		if (m_fSearchAble)
			*pdwFlags |= DWORD(PROPERTYCAPS_SEARCHABLE);
	} 

	return S_OK;
}
예제 #10
0
// ----------------------------------------------------------------------------
// Helptext_ToolBarButton_propget
// ----------------------------------------------------------------------------
void Helptext_ToolBarButton_propget (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs)
{
	BASIC_OP_TRACE(Helptext_ToolBarButton_propget);

// Test for typemismatch
	if (g_fDebugScript && isTypeMismatch (hThread, lpArgs, RTTI_ToolBarButton))
		return;

CComBSTR bstr;
HRESULT hr = ((DControlToolBarButton *)ebGetObject (lpArgs, 1)) -> get_HelpText (CLEARED(&bstr));

	if (FAILED(hr))	{
		ebSetString (lpArgs, 0, NULL);
		return;
	}

	USES_CONVERSION;
	ebSetString (lpArgs, 0, ebCreateString (hThread, OLE2A(bstr)));
}
예제 #11
0
HRESULT CDispUIOwner::OnSelect (ITRiASBar *pIBar, UINT uiID, LPSTR pBuffer, ULONG ulLen, ULONG *pulWritten)
{
	if (/*NULL == pIBar ||*/ NULL == pBuffer || 0 == ulLen) 
		return E_POINTER;

CComBSTR bstrDesc;
HRESULT hr = m_TargetUIOwner -> GetDescription (uiID, CLEARED(&bstrDesc));

	if (SUCCEEDED(hr)) {
		USES_CONVERSION;

	string strDesc (!bstrDesc ? g_cbNil : OLE2A(bstrDesc));

		if (NPOS == strDesc.find('\n'))
			strDesc += "\n" + strDesc;

		strcpy (pBuffer, strDesc.c_str());
		if (pulWritten)	
			*pulWritten = strlen (pBuffer);
		return NOERROR;
	}
	return hr;
}
예제 #12
0
// Lesen der Metadaten für eine Objektmenge
HRESULT DatenBasisObjekt::GetPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

VARIANT_BOOL fNameIsDefault = VARIANT_TRUE;

	USES_CONVERSION;
	{
	// wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus
		if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) &&
			MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))
		{
			return HRESULT_FROM_ERRCODE(WC_NOTFOUND);
		}

	// Objekteigenschaft aus globaler Tabelle lesen
	WTRiASFeature Feat;
	HRESULT hr = S_OK;

		if (FAILED(hr = GetFeatureFromMap (pData -> pbdCode, Feat)))
			return hr;

	// Testen, ob das gefundene Feature zur geforderten Datenquelle paßt
		if (HACTCONNECTION != hPr) {
		HPROJECT hPrTarget = NULL;

			RETURN_FAILED_HRESULT(GetDatabaseHandle (Feat, &hPrTarget));
			if (hPrTarget != hPr)		// MCode aus anderer Datenquelle
				return HRESULT_FROM_ERRCODE(WC_NOTFOUND);
		}

	// Namen lesen und in Rückgabestruktur setzen
	CComBSTR bstr;

		RETURN_FAILED_HRESULT(Feat -> get_Name (CLEARED(&bstr)));
		fNameIsDefault = GetPropertyFrom (Feat, g_cbNameIsDefault, VARIANT_FALSE);

	char *pStr = OLE2A(bstr);

		if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) {
			if (pStr) {
			int iLen = strlen (pStr);
			
				iLen = min(iLen, pData -> pbdKTextLen-1);
				strncpy (pData -> pbdKText, pStr, iLen);
				pData -> pbdKText[iLen] = '\0';
				pData -> pbdKTextLen = iLen;
			} else {
				*pData -> pbdKText = '\0';
				pData -> pbdKTextLen = 0;
			}
		} else 
			pData -> pbdKTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern

	// BeschreibungsInfo lesen und in Rückgabestruktur setzen
	CComBSTR bstrLT;

		if (SUCCEEDED(Feat -> get_Description (CLEARED(&bstrLT)))) {
		// möglicherweise wird 'get_Description' nicht unterstützt
		char *pStr = OLE2A(bstrLT);

			if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) {
				if (pStr) {
				int iLen = strlen (pStr);

					iLen = min(iLen, pData -> pbdLTextLen-1);
					strncpy (pData -> pbdLText, pStr, iLen);
					pData -> pbdLText[iLen] = '\0';
					pData -> pbdLTextLen = iLen;
				} else {
					*pData -> pbdLText = '\0';
					pData -> pbdLTextLen = 0;
				}
			} else 
				pData -> pbdLTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern
		} else
			pData -> pbdLTextLen = 0;

	// evtl. zusätzliche Infos liefern
		if (sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) {
		PBDMERKMAL *pPbdM = (PBDMERKMAL *)pData;
		FEATURETYPE rgType = FEATURETYPE_Unknown;

			pPbdM -> ipbdMTyp = 'a';	// Objektmerkmal
			if (SUCCEEDED(Feat -> get_Type (&rgType))) {
			// Typ der Objekteigenschaft festellen
				switch (VT_FROM_DATATYPE(rgType)) {
				case VT_I4:
				case VT_I2:
				case VT_I1:
				case VT_INT:
				case VT_UI4:
				case VT_UI2:
				case VT_UI1:
				case VT_UINT:
				case VT_BOOL:
				case VT_ERROR:
					pPbdM -> ipbdMTyp = 'i';
					break;

				case VT_R4:
				case VT_R8:
				case VT_DATE:
					pPbdM -> ipbdMTyp = 'f';
					break;

				default:
					break;		// VT_BSTR --> 'a'
				}

			// zusätzliche 
				if (rgType & FEATURETYPE_System)
					pPbdM -> ipbdMTyp |= PBDMERKMAL_SYSTEMFLAG;
				if (rgType & FEATURETYPE_ReadOnly)
					pPbdM -> ipbdMTyp |= PBDMERKMAL_READONLY;
			}

		// Platzbedarf der Objekteigenschaft feststellen
		long lLen = 0;

			if (SUCCEEDED(Feat -> get_Length (&lLen))) 
				pPbdM -> ipbdMLen = lLen;
			else
				pPbdM -> ipbdMLen = _MAX_PATH;	// doch recht willkürlich
		}

	} 
	return fNameIsDefault ? S_FALSE : S_OK;
}
예제 #13
0
// Lesen der Metadaten für eine Objektmenge
HRESULT DatenBasisObjekt::GetPBDDataIdent (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

VARIANT_BOOL fNameIsDefault = VARIANT_TRUE;

	USES_CONVERSION;
	{
	// Objektmenge aus globaler Tabelle lesen
	WTRiASObjects Objs;
	HRESULT hr = S_OK;

		if (FAILED(hr = GetObjectsFromMap (pData -> pbdCode, Objs)))
			return hr;

	// Testen, ob das gefundene Objektmenge zur geforderten Datenquelle paßt
		if (HACTCONNECTION != hPr) {
		HPROJECT hPrTarget = NULL;

			RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Objs, &hPrTarget));
			if (hPrTarget != hPr)			// Ident aus anderer Datenquelle
				return HRESULT_FROM_ERRCODE(WC_NOTFOUND);
		}

	// Namen lesen und in Rückgabestruktur setzen
	CComBSTR bstr;

		RETURN_FAILED_HRESULT(Objs -> get_Name (CLEARED(&bstr)));
		fNameIsDefault = GetPropertyFrom (Objs, g_cbNameIsDefault, VARIANT_TRUE);

	char *pStr = OLE2A(bstr);

		if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) {
			if (pStr) {
			int iLen = strlen (pStr);
			
				iLen = min(iLen, pData -> pbdKTextLen-1);
				strncpy (pData -> pbdKText, pStr, iLen);
				pData -> pbdKText[iLen] = '\0';
				pData -> pbdKTextLen = iLen;
			} else {
				*pData -> pbdKText = '\0';
				pData -> pbdKTextLen = 0;
			}
		} else 
			pData -> pbdKTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern

	// BeschreibungsInfo lesen und in Rückgabestruktur setzen
	CComBSTR bstrLT;

		if (SUCCEEDED(Objs -> get_Description (CLEARED(&bstrLT)))) {
		// möglicherweise wird 'get_Description' nicht unterstützt
		char *pStr = OLE2A(bstrLT);

			if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) {
				if (pStr) {
				int iLen = strlen (pStr);

					iLen = min(iLen, pData -> pbdLTextLen-1);
					strncpy (pData -> pbdLText, pStr, iLen);
					pData -> pbdLText[iLen] = '\0';
					pData -> pbdLTextLen = iLen;
				} else {
					*pData -> pbdLText = '\0';
					pData -> pbdLTextLen = 0;
				}
			} else 
				pData -> pbdLTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern
		} else
			pData -> pbdLTextLen = 0;

	}
	return fNameIsDefault ? S_FALSE : S_OK;
}
예제 #14
0
HRESULT CTRiASMIObjectsCollection::CreateObject (
	VARIANT NameOrHandle, DWORD dwType, const CLSID *pClsId, ITRiASObjects **ppIObjs)
{
	_ASSERTE(NULL != pClsId);
	if (NULL == pClsId) 
		return E_POINTER;

// diverse Vorbereitungen treffen
WDispatch App;
WDispatch Parent;
WTRiASObjectsCollection BaseObjs;

	RETURN_FAILED_HRESULT(m_BaseUnk -> QueryInterface (BaseObjs.ppi()));

	RETURN_FAILED_HRESULT(BaseObjs -> get_Application (App.ppi()));		// für neue Objektklasse
	RETURN_FAILED_HRESULT(BaseObjs -> get_Parent(Parent.ppi()));

// ZugriffsHandle/Namen oder OKS aus NameOrHandle bestimmen
LONG lHandle = 0;
CComVariant v;
bool fHasName = false;
bool fHasOKS = false;
CComBSTR bstrApp, bstrOKS;

	if (VT_BSTR != V_VT(&NameOrHandle) && SUCCEEDED(v.ChangeType (VT_I4, &NameOrHandle)))
		lHandle = V_I4(&v);
	else if (SUCCEEDED(v.ChangeType(VT_BSTR, &NameOrHandle))) {
	// feststellen, ob es ein OKS ist, evtl. Namen isolieren
		if (StringIsOKS(V_BSTR(&v), CLEARED(&bstrOKS), CLEARED(&bstrApp))) {
			if (bstrOKS.Length() > 0)
				fHasOKS = true;
		} else 
			bstrApp = V_BSTR(&v);

		if (bstrApp.Length() > 0)
			fHasName = true;
	} else
		return E_INVALIDARG;

// Objektklasse aus Handle/Name/OKS erzeugen
HRESULT hr = S_OK;

	COM_TRY {
	WTRiASObjects Objs (*pClsId);		// zu liefernde Objektklasse erzeugen

		THROW_FAILED_HRESULT(Objs -> put_Parent (Parent));

#pragma TODO("Neue Objektklasse in Datenbank erzeugen.")

		if (fHasName) 	// S_FALSE heißt: Objekt existiert bereits
			RETURN_FAILED_HRESULT(Objs -> put_Name (bstrApp));
		if (fHasOKS)
			RETURN_FAILED_HRESULT(Objs -> put_OKS (bstrOKS));

	// wenn Objektklasse bereits zu dieser Menge von Objektklassen gehört, dann liefert _Add den Wert S_FALSE
		hr = BaseObjs -> _Add (Objs, VARIANT_TRUE);
		if (SUCCEEDED(hr) && NULL != ppIObjs)
			*ppIObjs = Objs.detach();			// evtl. neue/gefundene Objektklasse liefern

	} COM_CATCH;
	return hr;
}
예제 #15
0
BOOL CPpgSelDataSource::FillDataSources()
{
    LONG lCntOpen = 0;
    int iSelItem = CB_ERR;

    USES_CONVERSION;
    COM_TRY {
        // alle Connections durchgehen und feststellen:
        // aktuelle Connection, ob beschreibbare Connection existiert
        WTRiASProject Prj;

        if (!DEX_GetActiveProjectPtr (*Prj.ppi()))
            _com_issue_error(E_UNEXPECTED);		// snh

        WTRiASConnections Conns;
        long lCnt = 0;

        THROW_FAILED_HRESULT(Prj -> get_Connections (Conns.ppi()));
        THROW_FAILED_HRESULT(Conns -> get_Count(&lCnt));

        CComboEntryMap Entries;

        for (long i = 1; i <= lCnt; i++) {
            CComVariant vIndex (i);
            WTRiASConnection Conn;

            THROW_FAILED_HRESULT(Conns -> Item (vIndex, Conn.ppi()));

            CONNECTSTATUS rgStatus = CONNECTSTATUS_Closed;

            THROW_FAILED_HRESULT(Conn -> get_Status (&rgStatus));
            if (CONNECTSTATUS_Opened == rgStatus) {
                CONNECTMODE rgRW = CONNECTMODE_OpenReadOnly;

                THROW_FAILED_HRESULT(Conn -> get_Mode (&rgRW));
                if (CONNECTMODE_OpenReadWrite ==
                CONNECTMODE(rgRW & ~CONNECTMODE_ResolutionFlags))
                {
                    // R/W geöffnet
                    CComBSTR bstrName;

                    THROW_FAILED_HRESULT(Conn -> get_Name (CLEARED(bstrName)));

                    // wenns die aktuelle ist, dann den Index speichern
                    WTRiASDatabase DBase;
                    HPROJECT lHandle = 0;

                    THROW_FAILED_HRESULT(Conn -> get_Database(DBase.ppi()));
                    THROW_FAILED_HRESULT(DBase -> get_Handle ((INT_PTR *)&lHandle));

                    Entries.insert(CComboEntryMap::value_type(OLE2A(bstrName),
                    pair<DWORD, HPROJECT>(datasource_icon::GetBitmapIndex(lHandle), lHandle)));
                }
            }
        }

        // jetzt in ComboBox einfügen (in alphabetischer Reihenfolge)
        CComboEntryMap::iterator end = Entries.end();

        for (CComboEntryMap::iterator it = Entries.begin(); it !=end; ++it) {
            COMBOBOXEXITEM item;

            item.mask = CBEIF_IMAGE|CBEIF_SELECTEDIMAGE|CBEIF_LPARAM|CBEIF_TEXT;
            item.iItem = -1;
            item.pszText = (LPTSTR)(LPCTSTR)(*it).first;
            item.iImage = item.iSelectedImage = (*it).second.first;
            item.lParam = (LPARAM)(*it).second.second;			// ProjectHandle zuordnen
            m_cbDataSources.InsertItem(&item);
            lCntOpen++;

            if ((*it).second.second == m_pParent->m_hPr)
                iSelItem = item.iItem;
        }

    } COM_CATCH_RETURN(FALSE);

    _ASSERTE(0 != lCntOpen);
    if (0 == lCntOpen) 		// keine Datenquellen vorhanden
        return FALSE;

    if (CB_ERR != iSelItem)
        m_cbDataSources.SetCurSel(iSelItem);
    else
        m_cbDataSources.SetCurSel(0);
    return TRUE;
}