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

📄 mstscax.cpp

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			assert(m_IDispatch);
			return m_IDispatch;
		}

		IMsTscAdvancedSettings * getIMsTscAdvancedSettings()
		{
			if(m_IMsTscAdvancedSettings)
				return m_IMsTscAdvancedSettings;
			else if(m_IMsRdpClientAdvancedSettings)
				m_IMsTscAdvancedSettings = m_IMsRdpClientAdvancedSettings;
			else if(m_IMsRdpClientAdvancedSettings2)
				m_IMsTscAdvancedSettings = m_IMsRdpClientAdvancedSettings2;
			else if(m_IMsRdpClientAdvancedSettings3)
				m_IMsTscAdvancedSettings = m_IMsRdpClientAdvancedSettings3;
			else if(m_IMsRdpClientAdvancedSettings4)
				m_IMsTscAdvancedSettings = m_IMsRdpClientAdvancedSettings4;

			if(m_IMsTscAdvancedSettings)
			{
				m_IMsTscAdvancedSettings->AddRef();
				return m_IMsTscAdvancedSettings;
			}

			m_IUnknown->QueryInterface(&m_IMsTscAdvancedSettings);
			return m_IMsTscAdvancedSettings;
		}

		IMsRdpClientAdvancedSettings * getIMsRdpClientAdvancedSettings()
		{
			if(m_IMsRdpClientAdvancedSettings)
				return m_IMsRdpClientAdvancedSettings;
			else if(m_IMsRdpClientAdvancedSettings2)
				m_IMsRdpClientAdvancedSettings = m_IMsRdpClientAdvancedSettings2;
			else if(m_IMsRdpClientAdvancedSettings3)
				m_IMsRdpClientAdvancedSettings = m_IMsRdpClientAdvancedSettings3;
			else if(m_IMsRdpClientAdvancedSettings4)
				m_IMsRdpClientAdvancedSettings = m_IMsRdpClientAdvancedSettings4;

			if(m_IMsRdpClientAdvancedSettings)
			{
				m_IMsRdpClientAdvancedSettings->AddRef();
				return m_IMsRdpClientAdvancedSettings;
			}

			m_IUnknown->QueryInterface(&m_IMsRdpClientAdvancedSettings);
			return m_IMsRdpClientAdvancedSettings;
		}

		IMsRdpClientAdvancedSettings2 * getIMsRdpClientAdvancedSettings2()
		{
			if(m_IMsRdpClientAdvancedSettings2)
				return m_IMsRdpClientAdvancedSettings2;
			else if(m_IMsRdpClientAdvancedSettings3)
				m_IMsRdpClientAdvancedSettings2 = m_IMsRdpClientAdvancedSettings3;
			else if(m_IMsRdpClientAdvancedSettings4)
				m_IMsRdpClientAdvancedSettings2 = m_IMsRdpClientAdvancedSettings4;

			if(m_IMsRdpClientAdvancedSettings2)
			{
				m_IMsRdpClientAdvancedSettings2->AddRef();
				return m_IMsRdpClientAdvancedSettings2;
			}

			m_IUnknown->QueryInterface(&m_IMsRdpClientAdvancedSettings2);
			return m_IMsRdpClientAdvancedSettings2;
		}

		IMsRdpClientAdvancedSettings3 * getIMsRdpClientAdvancedSettings3()
		{
			if(m_IMsRdpClientAdvancedSettings3)
				return m_IMsRdpClientAdvancedSettings3;
			else if(m_IMsRdpClientAdvancedSettings4)
				m_IMsRdpClientAdvancedSettings3 = m_IMsRdpClientAdvancedSettings4;

			if(m_IMsRdpClientAdvancedSettings3)
			{
				m_IMsRdpClientAdvancedSettings3->AddRef();
				return m_IMsRdpClientAdvancedSettings3;
			}

			m_IUnknown->QueryInterface(&m_IMsRdpClientAdvancedSettings3);
			return m_IMsRdpClientAdvancedSettings3;
		}

		IMsRdpClientAdvancedSettings4 * getIMsRdpClientAdvancedSettings4()
		{
			if(m_IMsRdpClientAdvancedSettings4)
				return m_IMsRdpClientAdvancedSettings4;

			if(m_IMsRdpClientAdvancedSettings4)
			{
				m_IMsRdpClientAdvancedSettings4->AddRef();
				return m_IMsRdpClientAdvancedSettings4;
			}

			m_IUnknown->QueryInterface(&m_IMsRdpClientAdvancedSettings4);
			return m_IMsRdpClientAdvancedSettings4;
		}

		~CAdvancedSettings()
		{
			m_IUnknown->Release();
			m_IDispatch->Release();

			if(m_IMsTscAdvancedSettings)
				m_IMsTscAdvancedSettings->Release();

			if(m_IMsRdpClientAdvancedSettings)
				m_IMsRdpClientAdvancedSettings->Release();

			if(m_IMsRdpClientAdvancedSettings2)
				m_IMsRdpClientAdvancedSettings2->Release();

			if(m_IMsRdpClientAdvancedSettings3)
				m_IMsRdpClientAdvancedSettings3->Release();

			if(m_IMsRdpClientAdvancedSettings4)
				m_IMsRdpClientAdvancedSettings4->Release();
		}

		void Init(IMsTscAdvancedSettings * p)
		{
			m_IMsTscAdvancedSettings = p;
		}

		void Init(IMsRdpClientAdvancedSettings * p)
		{
			m_IMsRdpClientAdvancedSettings = p;
		}

		void Init(IMsRdpClientAdvancedSettings2 * p)
		{
			m_IMsRdpClientAdvancedSettings2 = p;
		}

		void Init(IMsRdpClientAdvancedSettings3 * p)
		{
			m_IMsRdpClientAdvancedSettings3 = p;
		}

		void Init(IMsRdpClientAdvancedSettings4 * p)
		{
			m_IMsRdpClientAdvancedSettings4 = p;
		}

	public:
		template<class Interface> CAdvancedSettings(Interface * p):
			m_refCount(1),
			m_IUnknown(p),
			m_IDispatch(p),
			m_IMsTscAdvancedSettings(NULL),
			m_IMsRdpClientAdvancedSettings(NULL),
			m_IMsRdpClientAdvancedSettings2(NULL),
			m_IMsRdpClientAdvancedSettings3(NULL),
			m_IMsRdpClientAdvancedSettings4(NULL)
		{
			assert(p);
			p->AddRef();
			p->AddRef();
			Init(p);
		}

		/* IUnknown */
        virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject)
		{
			HRESULT hr;
			IUnknown * pvObject;
			
			dbgprintf(TEXT("CAdvancedSettings::QueryInterface(%ls, %p)"), UUIDToString(riid).c_str(), ppvObject);

#define QIBEGIN() \
	if(riid == IID_IUnknown) \
	{ \
		hr = S_OK; \
		pvObject = (IUnknown *)(this); \
	}

#define QI(I) \
	else if(riid == IID_ ## I) \
	{ \
		if(m_ ## I) \
		{ \
			m_ ## I->AddRef(); \
			hr = S_OK; \
		} \
		else \
		{ \
			hr = m_IUnknown->QueryInterface(&m_ ## I); \
		} \
 \
		if(SUCCEEDED(hr)) \
			pvObject = static_cast<I *>(this); \
	}

#define QIEND() \
	else \
	{ \
		hr = E_NOINTERFACE; \
		pvObject = NULL; \
	}

			QIBEGIN()
			QI(IDispatch)
			QI(IMsTscAdvancedSettings)
			QI(IMsRdpClientAdvancedSettings)
			QI(IMsRdpClientAdvancedSettings2)
			QI(IMsRdpClientAdvancedSettings3)
			QI(IMsRdpClientAdvancedSettings4)
			QIEND()

#undef QIBEGIN
#undef QIEND
#undef QI

			if(SUCCEEDED(hr))
			{
				assert(pvObject);
				pvObject->AddRef();
			}
			else
			{
				assert(pvObject == NULL);
			}

			*ppvObject = pvObject;

			dbgprintf(TEXT("CAdvancedSettings::QueryInterface -> %08X, ppvObject = %p"), hr, *ppvObject);
			return hr;
		}

        virtual ULONG STDMETHODCALLTYPE AddRef(void)
		{
			return InterlockedIncrement(&m_refCount);
		}

        virtual ULONG STDMETHODCALLTYPE Release(void)
		{
			LONG n = InterlockedDecrement(&m_refCount);

			if(n == 0)
				delete this;

			return n;
		}

		/* IDispatch */
		/*
			 * p = get();
			dbgprintf(TEXT("CAdvancedSettings::()"), );
			HRESULT hr = p->();
			dbgprintf(TEXT("CAdvancedSettings:: -> %08X, "), hr, );
			return hr;
		*/
		virtual STDMETHODIMP IDispatch::GetTypeInfoCount(UINT * pctinfo)
		{
			IDispatch * pIDispatch = getIDispatch();
			dbgprintf(TEXT("CAdvancedSettings::GetTypeInfoCount(%p)"), pctinfo);
			HRESULT hr = pIDispatch->GetTypeInfoCount(pctinfo);
			dbgprintf(TEXT("CAdvancedSettings::GetTypeInfoCount -> %08X, ctinfo = %u"), hr, *pctinfo);
			return hr;
		}

		virtual STDMETHODIMP IDispatch::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo ** ppTInfo)
		{
			IDispatch * pIDispatch = getIDispatch();
			dbgprintf(TEXT("CAdvancedSettings::GetTypeInfo(%u, %lu, %p)"), iTInfo, lcid, ppTInfo);
			HRESULT hr = pIDispatch->GetTypeInfo(iTInfo, lcid, ppTInfo);
			dbgprintf(TEXT("CAdvancedSettings::GetTypeInfo -> %08X, pTInfo = %p"), hr, *ppTInfo);
			return hr;
		}

		virtual STDMETHODIMP IDispatch::GetIDsOfNames(REFIID riid, LPOLESTR * rgszNames, UINT cNames, LCID lcid, DISPID * rgDispId)
		{
			IDispatch * pIDispatch = getIDispatch();
			dbgprintf(TEXT("CAdvancedSettings::GetIDsOfNames(%ls, %ls, %d, %lu, %p)"), UUIDToString(riid).c_str(), *rgszNames, cNames, lcid, rgDispId);
			HRESULT hr = pIDispatch->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId);
			dbgprintf(TEXT("CAdvancedSettings::GetIDsOfNames -> %08X, rgDispId = %ld"), hr, *rgDispId);
			return hr;
		}

		virtual STDMETHODIMP IDispatch::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
		{
			// TODO
			IDispatch * pIDispatch = getIDispatch();
			dbgprintf(TEXT("CAdvancedSettings::Invoke()")/*, */);
			HRESULT hr = pIDispatch->Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
			dbgprintf(TEXT("CAdvancedSettings::Invoke -> %08X, "), hr/*, */);
			return hr;
		}

		/* IMsTscAdvancedSettings */
		virtual STDMETHODIMP IMsTscAdvancedSettings::put_Compress(long pcompress)
		{
			IMsTscAdvancedSettings * pIMsTscAdvancedSettings = getIMsTscAdvancedSettings();
			dbgprintf(TEXT("CAdvancedSettings::put_Compress(%ld)"), pcompress);
			HRESULT hr = pIMsTscAdvancedSettings->put_Compress(pcompress);
			dbgprintf(TEXT("CAdvancedSettings::put_Compress -> %08X"), hr);
			return hr;
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_Compress(long * pcompress)
		{
			IMsTscAdvancedSettings * pIMsTscAdvancedSettings = getIMsTscAdvancedSettings();
			dbgprintf(TEXT("CAdvancedSettings::get_Compress(%p)"), pcompress);
			HRESULT hr = pIMsTscAdvancedSettings->get_Compress(pcompress);
			dbgprintf(TEXT("CAdvancedSettings::get_Compress -> %08X, compress = %ld"), hr, *pcompress);
			return hr;
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_BitmapPeristence(long pbitmapPeristence)
		{
			IMsTscAdvancedSettings * pIMsTscAdvancedSettings = getIMsTscAdvancedSettings();
			dbgprintf(TEXT("CAdvancedSettings::put_BitmapPeristence(%ld)"), pbitmapPeristence);
			HRESULT hr = pIMsTscAdvancedSettings->put_BitmapPeristence(pbitmapPeristence);
			dbgprintf(TEXT("CAdvancedSettings::put_BitmapPeristence -> %08X"), hr);
			return hr;
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_BitmapPeristence(long * pbitmapPeristence)
		{
			IMsTscAdvancedSettings * pIMsTscAdvancedSettings = getIMsTscAdvancedSettings();
			dbgprintf(TEXT("CAdvancedSettings::get_BitmapPeristence(%p)"), pbitmapPeristence);
			HRESULT hr = pIMsTscAdvancedSettings->get_BitmapPeristence(pbitmapPeristence);
			dbgprintf(TEXT("CAdvancedSettings::get_BitmapPeristence -> %08X, bitmapPeristence = %ld"), hr, *pbitmapPeristence);
			return hr;
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_allowBackgroundInput(long pallowBackgroundInput)
		{
			IMsTscAdvancedSettings * pIMsTscAdvancedSettings = getIMsTscAdvancedSettings();
			dbgprintf(TEXT("CAdvancedSettings::put_allowBackgroundInput(%ld)"), pallowBackgroundInput);

⌨️ 快捷键说明

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