📄 activex.cpp
字号:
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 + -