예제 #1
0
파일: Datahelp.cpp 프로젝트: hkaiser/TRiAS
// Hinzufügen eines EnumLONG zu einem IDataObject -----------------------------
HRESULT SetEnumLONGData (IEnum<LONG> *pEnum, REFCLSID rClsID, IDataObject *pDataObj)
{
	ASSERT(pEnum);
	ASSERT(pDataObj);

// Stream mit EnumLONG generieren
	WStream IStream;
	HRESULT hr = CreateStreamOnHGlobalFromIUnknown (pEnum, rClsID, IStream.ppi());
	if (FAILED(hr)) return hr;

// diesen Stream im DataObject setzen
	STGMEDIUM stg;
	stg.tymed = TYMED_ISTREAM;
	stg.pstm = IStream.detach();
	stg.pUnkForRelease = NULL;

	hr = pDataObj -> SetData ((FORMATETC *)&c_feSelectedObjects, &stg, true);
	if (FAILED(hr)) return hr;

	return NOERROR;
}
예제 #2
0
// Laden einer bestimmten PropertySequence
	HRESULT LoadPropertySequence (BSTR bstrName, IPropertyActionSequence **ppIPropertyActionSequence)
	{
		TEST_OUT_PARAM(ppIPropertyActionSequence);
		COM_TRY {
		WStorage Stg;

			if (FAILED(OpenPropSeqStorage (STGM_READ, Stg.ppi())))
				return E_FAIL;

		CComBSTR bstrStreamName;
		WStream	Strm;

			THROW_FAILED_HRESULT(MakeStreamName(bstrName, bstrStreamName));
			if (FAILED(Stg -> OpenStream (bstrStreamName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, Strm.ppi())))
				return E_FAIL;

		WPropertyActionSequence	Seq;

			THROW_FAILED_HRESULT(::OleLoadFromStream (Strm, Seq.GetIID(), Seq.ppv()));
			*ppIPropertyActionSequence = Seq.detach();

		} COM_CATCH;
		return S_OK;
	}
예제 #3
0
void PropertySequence_cmd_Load (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs)
{
	BASIC_OP_TRACE(PropertySequence_cmd_Load);

	ebSetBool (lpArgs, 0, 0);		// für alle Fälle

WPropertyActionSequence ISeq ((IPropertyActionSequence *)ebGetObject (lpArgs, 1));
HRESULT hr = E_FAIL;

// Versuchen aus SubStream einzulesen
	try {
	// SubStorage eröffnen
	WStorage IStg;

		hr = GetSubPropSeqStorage (IStg.ppi());
		if (FAILED(hr)) _com_issue_error(hr);

	// Description wurde als Parameter übergeben
	string strDesc;
	ebHSUB hStr = ebGetString (lpArgs, 2);

		if (NULL != hStr) {
			strDesc = ebLockString (hThread, hStr);
			ebUnlockString (hThread, hStr);
		}
	 
	WStream IStm;
	string strName = MakeStreamName(strDesc.c_str());

	// Stream erzeugen
		USES_CONVERSION;
		hr = IStg -> OpenStream (A2OLE(strName.c_str()), NULL, 
						STGM_READ|STGM_SHARE_EXCLUSIVE, 0L, IStm.ppi());
		if (FAILED(hr)) _com_issue_error(hr);

	// ggf. XML-Version einlesen, testen nicht möglich

	// aktuelle Streamposition speichern
	LARGE_INTEGER liToPos;
	ULARGE_INTEGER liPos;

		liPos.QuadPart = liToPos.QuadPart = 0;
		if (FAILED(hr = IStm -> Seek(liToPos, STREAM_SEEK_CUR, &liPos)))
			_com_issue_error(hr);

	DWORD dwSignature = 0;
	DWORD dwVersion = 0;
	bool fMustReset = true;

		LoadData(IStm, dwSignature);
		if (dwSignature == PROPERTYSEQUENCE_SIGNATURE) {
			LoadData(IStm, dwVersion);
			if ((dwVersion & ~PROPERTYSEQUENCE_MINORVERSIONMASK) 
				<= PROPERTYSEQUENCE_LASTKNOWNVERSION)
			{
			// Versionsvergleich ist möglich (wird hier aber nicht gemacht)
			os_string strVersion;

				LoadString(IStm, strVersion);
				fMustReset = false;
			}
		}

		if (fMustReset) {
		// Stream zurückpositionieren, damit alte Streams geladen werden können
			liToPos.QuadPart = liPos.QuadPart;
			if (FAILED(hr = IStm -> Seek(liToPos, STREAM_SEEK_SET, NULL)))
				_com_issue_error(hr);
		}

	// anstelle von OleLoadFromStrem ::Load direkt rufen, da Objekt
	// schon existiert
	CLSID clsId;

		hr = ReadClassStm (IStm, &clsId);
		if (FAILED(hr)) _com_issue_error(hr);

		if (!IsEqualCLSID(clsId, CLSID_PropertyActionSequence) && 
			!IsEqualCLSID(clsId, CLSID_NULL))
		{
			_com_issue_error(E_FAIL);
		}

		{
		WPersistStream PersStm (ISeq);	// throws hr

			hr = PersStm -> Load (IStm);		// Objekt laden
			if (FAILED(hr)) _com_issue_error(hr);
		}

	} catch (...) {
		TRACE("Couldn't OleLoadFromStream for IPropertyActionSequence\n");
		return;			// Fehler
	}

	ebSetBool (lpArgs, 0, -1);
}