RDP 动态虚拟通道 - 创建多个监听器
RDP Dynamic Virtual Channels - Creating multiple Listeners
我最近开始使用动态虚拟通道。
https://docs.microsoft.com/en-us/windows/desktop/termserv/dvc-implementation-details
我已经使用静态频道很长时间了,并且能够开发一个可以监听多个频道的插件。
我的问题是我无法让动态虚拟通道与多个侦听器一起工作。我需要使用 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;
}
这非常适合单通道。当我尝试添加其他侦听器时,只有最后一个会处于活动状态。有人知道如何向初始化方法添加额外的通道吗?
我的代码基于此:
https://docs.microsoft.com/en-us/windows/desktop/termserv/dvc-client-plug-in-example
找到了让它工作的方法。它需要更多 "duplicated-ish" 代码,但它可以工作。
我首先需要为每个要添加的频道创建一个额外的 ListenerCallback 和 ChannelCallback。这些还为每个频道提供了额外的 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;
}
我最近开始使用动态虚拟通道。
https://docs.microsoft.com/en-us/windows/desktop/termserv/dvc-implementation-details
我已经使用静态频道很长时间了,并且能够开发一个可以监听多个频道的插件。
我的问题是我无法让动态虚拟通道与多个侦听器一起工作。我需要使用 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;
}
这非常适合单通道。当我尝试添加其他侦听器时,只有最后一个会处于活动状态。有人知道如何向初始化方法添加额外的通道吗?
我的代码基于此: https://docs.microsoft.com/en-us/windows/desktop/termserv/dvc-client-plug-in-example
找到了让它工作的方法。它需要更多 "duplicated-ish" 代码,但它可以工作。
我首先需要为每个要添加的频道创建一个额外的 ListenerCallback 和 ChannelCallback。这些还为每个频道提供了额外的 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;
}