У меня есть приложение, использующее динамический виртуальный канал. При тестировании я обнаружил, что для некоторых пользователей иногда происходит сбой. WTSVirtualChannelOpenEx имеет ошибку 31. Я видел другой вопрос по этому поводу, но я использую нативный C ++ и использовал константу TRUE (которую я проверил на самом деле 1), так что это здесь не применимо. Кроме того, тот факт, что это работает, иногда подсказывает мне, что это, вероятно, не конкретная ошибка в моем коде. Я фактически заново внедрил канал ECHO для тестирования инфраструктуры.
class WTSVirtualChannelCallback : public IntrusiveRefCount<IWTSVirtualChannelCallback> {
std::unique_ptr<IWTSVirtualChannel, ReleaseDeleter> virtualChannel;
public:
WTSVirtualChannelCallback(std::unique_ptr<IWTSVirtualChannel, ReleaseDeleter> virtualChannel)
: virtualChannel(std::move(virtualChannel)) {}
HRESULT __stdcall OnDataReceived(ULONG cbSize, BYTE *pBuffer) override {
return CheckExceptions([&] {
CheckHRESULT(virtualChannel->Write(cbSize, pBuffer, nullptr));
});
}
HRESULT __stdcall OnClose() override {
return S_OK;
}
};
class WTSListenerCallback : public IntrusiveRefCount<IWTSListenerCallback> {
public:
virtual HRESULT __stdcall OnNewChannelConnection(IWTSVirtualChannel *pChannel, BSTR data, BOOL *pbAccept, IWTSVirtualChannelCallback **ppCallback) override {
return CheckExceptions([&] {
std::unique_ptr<IWTSVirtualChannel, ReleaseDeleter> channel(pChannel);
*pbAccept = TRUE;
*ppCallback = new WTSVirtualChannelCallback(std::move(channel));
});
}
};
class __declspec(uuid("22d36a3c-04b1-4073-af3e-ba926c7a233e")) Plugin : public IntrusiveRefCount<IWTSPlugin> {
public:
HRESULT __stdcall Initialize(IWTSVirtualChannelManager *pChannelMgr) override {
return CheckExceptions([&] {
std::unique_ptr<IWTSVirtualChannelManager, ReleaseDeleter> channelManager(pChannelMgr);
CheckHRESULT(channelManager->CreateListener("Bluewire.Citrix.HardwareInputPlugin", 0, new WTSListenerCallback(), nullptr));
});
}
HRESULT __stdcall Connected() override {
return S_OK;
}
HRESULT __stdcall Disconnected(DWORD dwDisconnectCode) override {
return S_OK;
}
HRESULT __stdcall Terminated() override {
return S_OK;
}
};
Я сталкивался со многими людьми, сообщающими о проблемах в Windows Server 2012, но все задействованные здесь машины — это Win10 или Win7 — все настольные версии.
Любые предложения относительно того, в чем проблема здесь?
Задача ещё не решена.
Других решений пока нет …