⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transientsubscription.cpp

📁 【内容简介】 本书由一流的权威撰写
💻 CPP
字号:
// TransientSubscription.cpp : Defines the entry point for the application.
//

#include "StdAfx.h"
#include "../StockPrice/StockPrice.h"
#include "../StockPrice/StockPrice_i.c"
#import <com/comadmin.dll>

void sub();

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	CCPLComInitializer init;
	_Module.Init(NULL, hInstance);

	try {
		sub();
	}catch(_com_error& e) {
		::MessageBox(NULL, CPLGetError(e), NULL, MB_OK);
	}

	_Module.Term();

	return 0;
}

class CMyTransientEvent : 
	public IDispatchImpl<IMyStockPriceEvent, &IID_IMyStockPriceEvent, &LIBID_STOCKPRICELib>, 
	public CComObjectRoot
{
public:
	CMyTransientEvent() {}
	~CMyTransientEvent() {}

BEGIN_COM_MAP(CMyTransientEvent)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IMyStockPriceEvent)
END_COM_MAP()

// IMyStockPriceEvent
public:
	STDMETHOD(NewQuote)(/*[in]*/ BSTR bsSymbol, /*[in]*/ double dValue);
};

STDMETHODIMP CMyTransientEvent::NewQuote(BSTR bsSymbol, double dValue)
{
	TCHAR buf[100];
	_stprintf(buf, _T("%S %lf"), bsSymbol, dValue);
	::MessageBox(NULL, buf, _T("Transient Event : Stock Price"), MB_OK);

	return S_OK;
}

long GetIndexInCollection(COMAdmin::ICatalogCollectionPtr spColl, _bstr_t bsSubscriptionName);

void sub()
{
	CComPtr<CComObject<CMyTransientEvent> > spEvent;
	HRESULT hr = CComObject<CMyTransientEvent>::CreateInstance(&spEvent);
	_ASSERT(SUCCEEDED(hr));
	spEvent->InternalAddRef();

	_bstr_t bsSubscriptionName = "My transient subscription";

	COMAdmin::ICOMAdminCatalogPtr spCat(__uuidof(COMAdmin::COMAdminCatalog));
	
	COMAdmin::ICatalogCollectionPtr spColl = spCat->GetCollection("TransientSubscriptions");

	IDispatchPtr spDisp = spColl->Add();
	COMAdmin::ICatalogObjectPtr spCatObject = spDisp;
	spCatObject->Value["Name"] = bsSubscriptionName;
	spCatObject->Value["InterfaceID"] ="{A9E6D819-1891-462D-B32C-ED4AFD61B08B}";
	/*[optional]*/ // spCatObject->Value["EventCLSID"] = "{1F6F353D-5738-4C05-9DA1-A64E19370A0E}";
	/*[optional]*/ // spCatObject->Value["PublisherID"] = "My Stock Price Publisher X";
	spCatObject->Value["SubscriberInterface"] = static_cast<IUnknown*>(spEvent);

	spColl->SaveChanges();

	::MessageBox(NULL, "Click OK to exit", "Transient Event", MB_OK);

	// Remove the object
	spColl = spCat->GetCollection("TransientSubscriptions");
	spColl->Populate();
	long lIndex = GetIndexInCollection(spColl, bsSubscriptionName);
	spColl->Remove(lIndex);
	spColl->SaveChanges();
	::MessageBox(NULL, "Removed the handler", "Transient Event", MB_OK);
}

long GetIndexInCollection(COMAdmin::ICatalogCollectionPtr spColl, _bstr_t bsSubscriptionName)
{
	long lTotal = spColl->Count;
	for (long i = 0; i< lTotal; i++) {
		IDispatchPtr spDisp = spColl->Item[i];
		COMAdmin::ICatalogObjectPtr spCatObject = spDisp;
		_bstr_t bsName = spCatObject->Name;
		if (!wcsicmp(bsName, bsSubscriptionName))
			return i;
	}
	return -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -