c++ - RDP 动态虚拟 channel - 创建多个监听器

标签 c++ rdp

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

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

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

我的问题是我无法让动态虚拟 channel 与多个监听器一起工作。我需要使用 DVC 来解决我在使用静态 channel 时遇到的一些并发问题。

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

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;
}

这非常适合单个 channel 。当我尝试添加其他监听器时,只有最后一个会处于事件状态。有人知道如何向初始化方法添加额外的 channel 吗?

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

最佳答案

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

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

Initialize 方法需要稍微修改一下。可能可以清理更多,但有效。

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

    // chanA
    CComObject<ListenerCallback_chanA> *pListenerCallback_chanA;
    CComPtr<ListenerCallback_chanA> ptrListenerCallback_chanA;
    CComPtr<IWTSListener> ptrListener_chanA;

    // Create an instance of the DVCPlugin object.
    HRESULT hr_chanA = CComObject<ListenerCallback_chanA>::CreateInstance(&pListenerCallback_chanA);
    ptrListenerCallback_chanA = pListenerCallback_chanA;

    // Attach the callback to the endpoint.
    hr_chanA = pChannelMgr->CreateListener(
        DVC_chanA,
        0,
        (ListenerCallback_chanA*)ptrListenerCallback_chanA,
        &ptrListener_chanA);

    if (hr_chanA != S_OK) {
        hr = hr_chanA;
    }

    // chanB
    CComObject<ListenerCallback_chanB> *pListenerCallback_chanB;
    CComPtr<ListenerCallback_chanB> ptrListenerCallback_chanB;
    CComPtr<IWTSListener> ptrListener_chanB;

    // Create an instance of the DVCPlugin object.
    HRESULT hr_chanB = CComObject<ListenerCallback_chanB>::CreateInstance(&pListenerCallback_chanB);
    ptrListenerCallback_chanB = pListenerCallback_chanB;

    hr_chanB = pChannelMgr->CreateListener(
        DVC_chanB,
        0,
        (ListenerCallback_chanB*)ptrListenerCallback_chanB,
        &ptrListener_chanB);

    if (hr_chanB != S_OK) {
        hr = hr_chanB;


    // All listeners created check
    if (hr == S_OK) {
        MessageBox(NULL, L"DVC plugin is enabled!", L"Info...", MB_OK | MB_ICONWARNING);
    }
    else {
        MessageBox(NULL, L"DVC plugin is NOT ENABLED!", L"Info...", MB_OK | MB_ICONWARNING);
    }

    return hr;
}

关于c++ - RDP 动态虚拟 channel - 创建多个监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125818/

相关文章:

c++ - 用特征随机排列矩阵的行/列

c++ - Lua 脚本 - 再次运行

c++ - Qt:自动向QGroupbox添加滚动条

java - 确定 Java 应用程序是否正在通过 RDP session 运行?

environment-variables - 如果以管理员身份运行,RDP "ClientName"环境变量为空

java - 使用 Java 加密 RDP 密码

c++ - 如何解决悬空的 const ref

windows-7 - 即使防火墙关闭,windows远程桌面也无法连接

c# - 如何检测当前 session 是否通过 RDP 启动?

c++ - 为什么不能将字符串文字传递给使用模板参数的函数?