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

📄 activex.cpp

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			pvObject = static_cast<IOleControl *>(this);
		else if(riid == IID_IOleInPlaceActiveObject)
			pvObject = static_cast<IOleInPlaceActiveObject *>(this);
		else if(riid == IID_IOleInPlaceObject)
			pvObject = static_cast<IOleInPlaceObject *>(this);
		else if(riid == IID_IOleObject)
			pvObject = static_cast<IOleObject *>(this);
		else if(riid == IID_IOleWindow)
			pvObject = static_cast<IOleWindow *>(this);
		else if(riid == IID_IPersist)
			pvObject = static_cast<IPersist *>(this);
		else if(riid == IID_IPersistPropertyBag)
			pvObject = static_cast<IPersistPropertyBag *>(this);
		else if(riid == IID_IPersistStorage)
			pvObject = static_cast<IPersistStorage *>(this);
		else if(riid == IID_IPersistStreamInit)
			pvObject = static_cast<IPersistStreamInit *>(this);
		else if(riid == IID_IQuickActivate)
			pvObject = static_cast<IQuickActivate *>(this);
		else if(riid == IID_IViewObject)
			pvObject = static_cast<IViewObject *>(this);
		else if(riid == IID_IViewObject2)
			pvObject = static_cast<IViewObject2 *>(this);
		else if(riid == IID_IMsTscAx || riid == MSTSCLib_Redist::IID_IMsTscAx)
			pvObject = static_cast<IMsTscAx *>(this);
		else if(riid == IID_IMsRdpClient)
			pvObject = static_cast<IMsRdpClient *>(this);
		else if(riid == IID_IMsRdpClient2)
			pvObject = static_cast<IMsRdpClient2 *>(this);
		else if(riid == IID_IMsRdpClient3)
			pvObject = static_cast<IMsRdpClient3 *>(this);
		else if(riid == IID_IMsRdpClient4)
			pvObject = static_cast<IMsRdpClient4 *>(this);
		else if(riid == IID_IMsTscNonScriptable)
			pvObject = static_cast<IMsTscNonScriptable *>(this);
		else if(riid == IID_IMsRdpClientNonScriptable)
			pvObject = static_cast<IMsRdpClientNonScriptable *>(this);
		else if(riid == IID_IMsRdpClientNonScriptable2)
			pvObject = static_cast<IMsRdpClientNonScriptable2 *>(this);

		*ppvObject = pvObject;

		if(pvObject)
		{
			pvObject->AddRef();
			return S_OK;
		}

		return E_NOINTERFACE;
	}

	ULONG addRef()
	{
		return InterlockedIncrement(&m_refCount);
	}

	ULONG release()
	{
		LONG n = InterlockedDecrement(&m_refCount);

		if(n == 0)
			delete this;

		return n;
	}

	/* Constructor */
	RdpClient(REFCLSID classId, unsigned libIndex, IUnknown * punkOuter):
		// COM/OLE internals
		m_refCount(0),
		m_punkOuter(punkOuter),
		m_classId(classId),
		m_typeLibIndex(libIndex),
		m_typeLib(),
		m_dispTypeInfo(),
		m_controlWindow(NULL),
		m_clientSite(),
		m_inPlaceSite(),
		m_adviseHolder(),
		m_freezeEvents(0),
		m_uiActive(false),
		m_SafetyOptions(),

#ifdef _DEBUG
		m_apartmentThreadId(GetCurrentThreadId()),
#endif

		// rdesktop-core interface
		m_protocolState(),
		m_protocolThread(),

		// Properties
		m_Server(),
		m_Domain(),
		m_UserName(),
		m_DisconnectedText(),
		m_ConnectingText(),
		m_FullScreenTitle(),
		m_StartProgram(),
		m_WorkDir(),
		m_LoadBalanceInfo(),
		m_ConnectedStatusText(),
		m_ClearTextPassword(),
		m_RdpdrLocalPrintingDocName(),
		m_RdpdrClipCleanTempDirString(),
		m_RdpdrClipPasteInfoString(),
		m_UIParentWindowHandle(),
		m_DesktopWidth(),
		m_DesktopHeight(),
		m_StartConnected(),
		m_ColorDepth(16),
		m_KeyboardHookMode(2),
		m_AudioRedirectionMode(0),
		m_TransportType(1), // BUGBUG: ??? what's this ???
		m_SasSequence(0xAA03), // BUGBUG: ??? what's this ???
		m_RDPPort(3389),
		m_HotKeyFullScreen(VK_CANCEL),
		m_HotKeyAltEsc(VK_INSERT),
		m_HotKeyAltShiftTab(VK_NEXT),
		m_HotKeyAltSpace(VK_DELETE),
		m_HotKeyAltTab(VK_PRIOR),
		m_HotKeyCtrlAltDel(VK_END),
		m_HotKeyCtrlEsc(VK_HOME),
		m_orderDrawThresold(0),
		m_BitmapCacheSize(1500),
		m_BitmapVirtualCacheSize(10),
		m_brushSupportLevel(),
		m_minInputSendInterval(),
		m_InputEventsAtOnce(),
		m_maxEventCount(),
		m_keepAliveInternal(0),
		m_shutdownTimeout(10),
		m_overallConnectionTimeout(120),
		m_singleConnectionTimeout(30),
		m_MinutesToIdleTimeout(0),
		m_BitmapVirtualCache16BppSize(20),
		m_BitmapVirtualCache24BppSize(30),
		m_PerformanceFlags(),
		m_MaxReconnectAttempts(20),
		m_AuthenticationLevel(0),
		m_ExtendedDisconnectReason(MSTSCLib::exDiscReasonNoInfo),
		m_Connected(false),
		m_Compress(true),
		m_BitmapPersistence(true),
		m_allowBackgroundInput(false),
		m_ContainerHandledFullScreen(false),
		m_DisableRdpdr(false),
		m_SecuredSettingsEnabled(true),
		m_FullScreen(false),
		m_AcceleratorPassthrough(true),
		m_ShadowBitmap(true),
		m_EncryptionEnabled(true),
		m_DedicatedTerminal(false),
		m_DisableCtrlAltDel(true),
		m_EnableWindowsKey(true),
		m_DoubleClickDetect(false),
		m_MaximizeShell(true),
		m_ScaleBitmapCachesByBpp(false),
		m_CachePersistenceActive(false),
		m_ConnectToServerConsole(false),
		m_SmartSizing(false),
		m_DisplayConnectionBar(true),
		m_PinConnectionBar(true),
		m_GrabFocusOnConnect(true),
		m_RedirectDrives(false),
		m_RedirectPrinters(false),
		m_RedirectPorts(false),
		m_RedirectSmartCards(false),
		m_NotifyTSPublicKey(false),
		m_CanAutoReconnect(false),
		m_EnableAutoReconnect(true),
		m_ConnectionBarShowMinimizeButton(true),
		m_ConnectionBarShowRestoreButton(true)
	{
		if(m_punkOuter == NULL)
			m_punkOuter = &m_inner;
	}

	/* Destructor */
	~RdpClient()
	{
		assert(m_refCount == 0);

		if(m_Connected)
		{
			// Terminate the protocol thread
			TerminateProtocolThread();

			// Dispatch the RDPC_WM_DISCONNECT message sent by the dying thread
			MSG msg;
			PeekMessage(&msg, m_controlWindow, 0, 0, PM_NOREMOVE);

			assert(!m_Connected);
		}

		DestroyControlWindow();

		if(m_typeLib)
			m_typeLib->Release();

		if(m_dispTypeInfo)
			m_dispTypeInfo->Release();

		MSTSCLib::IMsTscAxEvents ** sinks = GetSinks();

		for(size_t i = 0; i < m_EventSinksCount; ++ i)
			sinks[i]->Release();

		if(m_EventSinksCount > 1)
			delete[] m_EventSinks;

		if(m_clientSite)
			m_clientSite->Release();

		if(m_inPlaceSite)
			m_inPlaceSite->Release();

		if(m_adviseHolder)
			m_adviseHolder->Release();

		SysFreeString(m_Domain);
		SysFreeString(m_UserName);
		SysFreeString(m_DisconnectedText);
		SysFreeString(m_DisconnectedText);
		SysFreeString(m_FullScreenTitle);
		SysFreeString(m_StartProgram);
		SysFreeString(m_WorkDir);
		SysFreeString(m_ConnectedStatusText);
		SysFreeString(m_ClearTextPassword);
		SysFreeString(m_RdpdrLocalPrintingDocName);
		SysFreeString(m_RdpdrClipCleanTempDirString);
		SysFreeString(m_RdpdrClipPasteInfoString);

		FreeLpsz(m_LoadBalanceInfo);
		FreeLpsz(m_Server);

		unlockServer();
	}

	/* Advanced settings wrapper */
	friend class AdvancedSettings;

	class AdvancedSettings SEALED_: public MSTSCLib::IMsRdpClientAdvancedSettings4
	{
	private:
		RdpClient * Outer()
		{
			return InnerToOuter(this);
		}

		const RdpClient * Outer() const
		{
			return InnerToOuter(this);
		}

		/* IDispatch type information */
		ITypeInfo * m_dispTypeInfo;

		HRESULT LoadDispTypeInfo()
		{
			if(m_dispTypeInfo)
				return S_OK;

			HRESULT hr = Outer()->LoadTypeLibrary();

			if(FAILED(hr))
				return hr;

			assert(MSTSCLib::IID_IMsRdpClientAdvancedSettings4 == MSTSCLib_Redist::IID_IMsRdpClientAdvancedSettings4);

			hr = Outer()->m_typeLib->GetTypeInfoOfGuid(MSTSCLib::IID_IMsRdpClientAdvancedSettings4, &m_dispTypeInfo);

			if(FAILED(hr))
				return hr;

			assert(m_dispTypeInfo);
			return S_OK;
		}

		HRESULT AcquireDispTypeInfo(ITypeInfo ** ppTI)
		{
			HRESULT hr = LoadDispTypeInfo();

			if(FAILED(hr))
				return hr;

			m_dispTypeInfo->AddRef();
			*ppTI = m_dispTypeInfo;
			return S_OK;
		}

	public:
		~AdvancedSettings()
		{
			if(m_dispTypeInfo)
				m_dispTypeInfo->Release();
		}

		/* IUnknown */
		virtual STDMETHODIMP IUnknown::QueryInterface(REFIID riid, void ** ppvObject)
		{
			using namespace MSTSCLib;

			if
			(
				riid == IID_IUnknown ||
				riid == IID_IDispatch ||
				riid == IID_IMsTscAdvancedSettings ||
				riid == IID_IMsRdpClientAdvancedSettings ||
				riid == IID_IMsRdpClientAdvancedSettings2 ||
				riid == IID_IMsRdpClientAdvancedSettings3 ||
				riid == IID_IMsRdpClientAdvancedSettings4
			)
			{
				*ppvObject = this;
				Outer()->addRef();
				return S_OK;
			}
			else
			{
				*ppvObject = NULL;
				return E_NOINTERFACE;
			}
		}

		virtual STDMETHODIMP_(ULONG) IUnknown::AddRef()
		{
			return Outer()->addRef();
		}

		virtual STDMETHODIMP_(ULONG) IUnknown::Release()
		{
			return Outer()->release();
		}

		/* IDispatch */
		virtual STDMETHODIMP IDispatch::GetTypeInfoCount(UINT * pctinfo)
		{
			*pctinfo = 1;
			return S_OK;
		}

		virtual STDMETHODIMP IDispatch::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo ** ppTInfo)
		{
			if(iTInfo != 0)
				return DISP_E_BADINDEX;
		
			return AcquireDispTypeInfo(ppTInfo);
		}

		virtual STDMETHODIMP IDispatch::GetIDsOfNames(REFIID riid, LPOLESTR * rgszNames, UINT cNames, LCID lcid, DISPID * rgDispId)
		{
			HRESULT hr = LoadDispTypeInfo();

			if(FAILED(hr))
				return hr;

			return m_dispTypeInfo->GetIDsOfNames(rgszNames, cNames, rgDispId);
		}

		virtual STDMETHODIMP IDispatch::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
		{
			return m_dispTypeInfo->Invoke
			(
				static_cast<MSTSCLib::IMsRdpClientAdvancedSettings4 *>(this),
				dispIdMember,
				wFlags,
				pDispParams,
				pVarResult,
				pExcepInfo,
				puArgErr
			);
		}

		/* IMsTscAdvancedSettings */
		virtual STDMETHODIMP IMsTscAdvancedSettings::put_Compress(long pcompress)
		{
			return Outer()->SetProperty(Outer()->m_Compress, pcompress);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_Compress(long * pcompress) const
		{
			return Outer()->GetProperty(Outer()->m_Compress, pcompress);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_BitmapPeristence(long pbitmapPeristence)
		{
			return Outer()->SetProperty(Outer()->m_BitmapPersistence, pbitmapPeristence);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_BitmapPeristence(long * pbitmapPeristence) const
		{
			return Outer()->GetProperty(Outer()->m_BitmapPersistence, pbitmapPeristence);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_allowBackgroundInput(long pallowBackgroundInput)
		{
			if(Outer()->IsSafeForScripting())
				return S_FALSE;

			return Outer()->SetProperty(Outer()->m_allowBackgroundInput, pallowBackgroundInput);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_allowBackgroundInput(long * pallowBackgroundInput) const
		{
			return Outer()->GetProperty(Outer()->m_allowBackgroundInput, pallowBackgroundInput);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_KeyBoardLayoutStr(BSTR rhs)
		{
			return Outer()->SetProperty(Outer()->m_KeyboardLayoutString, rhs);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_PluginDlls(BSTR rhs)
		{
			// TODO: split rhs into an array

			// Control marked safe for scripting: only allow filenames
			if(Outer()->IsSafeForScripting())
			{
				// TODO: validate entries
				// TODO: replace each entry with a full path based on the Virtual Channel DLL path
			}

			return E_NOTIMPL; // TODO
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_IconFile(BSTR rhs)
		{
			return E_NOTIMPL;
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_IconIndex(long rhs)
		{
			return E_NOTIMPL;
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_ContainerHandledFullScreen(long pContainerHandledFullScreen)
		{
			if(Outer()->IsSafeForScripting())
				return S_FALSE;

			return Outer()->SetProperty(Outer()->m_ContainerHandledFullScreen, pContainerHandledFullScreen);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_ContainerHandledFullScreen(long * pContainerHandledFullScreen) const
		{
			return Outer()->GetProperty(Outer()->m_ContainerHandledFullScreen, pContainerHandledFullScreen);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::put_DisableRdpdr(long pDisableRdpdr)
		{
			return Outer()->SetProperty(Outer()->m_DisableRdpdr, pDisableRdpdr);
		}

		virtual STDMETHODIMP IMsTscAdvancedSettings::get_DisableRdpdr(long * pDisableRdpdr) const
		{
			return Outer()->GetProperty(Outer()->m_DisableRdpdr, pDisableRdpdr);
		}

		/* IMsRdpClientAdvancedSettings */
		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_SmoothScroll(long psmoothScroll)
		{
			return S_FALSE;
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_SmoothScroll(long * psmoothScroll) const
		{
			return S_FALSE;
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_AcceleratorPassthrough(long pacceleratorPassthrough)
		{
			return Outer()->SetProperty(Outer()->m_AcceleratorPassthrough, pacceleratorPassthrough);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_AcceleratorPassthrough(long * pacceleratorPassthrough) const
		{
			return Outer()->GetProperty(Outer()->m_AcceleratorPassthrough, pacceleratorPassthrough);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_ShadowBitmap(long pshadowBitmap)
		{
			return Outer()->SetProperty(Outer()->m_ShadowBitmap, pshadowBitmap);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_ShadowBitmap(long * pshadowBitmap) const
		{
			return Outer()->GetProperty(Outer()->m_ShadowBitmap, pshadowBitmap);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_TransportType(long ptransportType)
		{
			// Reserved
			return Outer()->SetProperty(Outer()->m_TransportType, ptransportType);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_TransportType(long * ptransportType) const
		{
			// Reserved
			return Outer()->GetProperty(Outer()->m_TransportType, ptransportType);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_SasSequence(long psasSequence)
		{
			// Reserved
			return Outer()->SetProperty(Outer()->m_SasSequence, psasSequence);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_SasSequence(long * psasSequence) const
		{
			// Reserved
			return Outer()->GetProperty(Outer()->m_SasSequence, psasSequence);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_EncryptionEnabled(long pencryptionEnabled)
		{
			return Outer()->SetProperty(Outer()->m_EncryptionEnabled, pencryptionEnabled);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_EncryptionEnabled(long * pencryptionEnabled) const
		{
			return Outer()->GetProperty(Outer()->m_EncryptionEnabled, pencryptionEnabled);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_DedicatedTerminal(long pdedicatedTerminal)
		{
			return Outer()->SetProperty(Outer()->m_DedicatedTerminal, pdedicatedTerminal);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::get_DedicatedTerminal(long * pdedicatedTerminal) const
		{
			return Outer()->GetProperty(Outer()->m_DedicatedTerminal, pdedicatedTerminal);
		}

		virtual STDMETHODIMP IMsRdpClientAdvancedSettings::put_RDPPort(long prdpPort)
		{
			if(prdpPort == 0 || prdpPort > 65535)
				return E_INVALIDARG;

			r

⌨️ 快捷键说明

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