RDP动态虚拟通道-创建多个侦听器

时间:2019-03-12 15:58:18

标签: c++ rdp

我最近开始使用动态虚拟频道。

https://docs.microsoft.com/en-us/windows/desktop/termserv/dvc-implementation-details

我已经使用Static频道很长时间了,并且能够开发一个可以监听多个频道的插件。

我的问题是我无法使动态虚拟通道与多个侦听器一起使用。我需要使用DVC解决静态通道遇到的一些并发问题。

这是我对单个通道的初始化方法:

HRESULT DVCPlugin::Initialize(__in IWTSVirtualChannelManager *pChannelMgr)
{
    HRESULT hr;

    CComObject<ListenerCallback> *pListenerCallback;
    CComPtr<ListenerCallback> ptrListenerCallback;
    CComPtr<IWTSListener> ptrListener;

    // Create an instance of the DVCPlugin object.
    hr = CComObject<ListenerCallback>::CreateInstance(&pListenerCallback);
    ptrListenerCallback = pListenerCallback;

    // Attach the callback to the endpoint.
    hr = pChannelMgr->CreateListener(
        DVC_CHANNEL,
        0,
        (ListenerCallback*)ptrListenerCallback,
        &ptrListener);

    if (hr == S_OK) {
        MessageBox(NULL, L"DVC plugin is enabled!", L"Info...", MB_OK | MB_ICONWARNING);
    }
    else {
        MessageBox(NULL, L"DVC plugin initialize failure!", L"Info...", MB_OK | MB_ICONWARNING);
    }

    return hr;
}

这非常适合单个频道。当我尝试添加其他侦听器时,只有最后一个侦听器将处于活动状态。有谁知道如何在initialize方法中添加其他通道?

我的代码基于此: https://docs.microsoft.com/en-us/windows/desktop/termserv/dvc-client-plug-in-example

1 个答案:

答案 0 :(得分:0)

找到了使其正常工作的方法。它需要更多的“重复的”代码,但是可以工作。

我首先需要为要添加的每个频道创建一个附加的ListenerCallback和ChannelCallback。这些还为每个通道提供了额外的OnNewChannelConnection和OnDataReceived函数。

然后需要稍微初始化Initialize方法。可能可以进行更多清理,但是可以。

<script>    
var flag = true;
function myFunction(){
  let el = document.getElementById("demo");
  el.style.fontsize = flag ? "25px" : "";
  el.style.color= flag ? "#3AF702" : "";
  el.style.backgroundcolor=flag ? "red" : "";   
  flag = !flag; 
}    
</script>`

<button type="change" onclick="myFunction()">Change!</button>