andreybandasov Ответов: 1

Не удается подключиться через rdp с помощью IMsTscAx


Привет! Я не могу подключиться через RDP с помощью MsTscAx. Я всегда получаю успех, даже если я установил неправильный ip: login:password. И у меня нет ошибок во время запросов. Я не понимаю, почему? Кто-нибудь может мне помочь? Фрагмент кода:

#include <Windows.h>
#include <CommCtrl.h>
#include <tchar.h>
#include "resource.h"
#include <atlbase.h>
#pragma comment(linker, \
  "\"/manifestdependency:type='Win32' "\
  "name='Microsoft.Windows.Common-Controls' "\
  "version='6.0.0.0' "\
  "processorArchitecture='*' "\
  "publicKeyToken='6595b64144ccf1df' "\
  "language='*'\"")

#pragma comment(lib, "ComCtl32.lib")
#import "C:\\Windows\\System32\\mstscax.dll"
using namespace MSTSCLib;

class CTscEventSink : public IMsTscAxEvents
{
public:
	CTscEventSink()
	{
		_ulRefs = 1;
		m_dwEvtCookie = 0;
	}

	~CTscEventSink()
	{
	}

	BOOL	Attach(IMsTscAx* pTscAx)
	{
		CComPtr<IConnectionPointContainer>	cpCPCont;
		HRESULT hr;

		hr = pTscAx->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&cpCPCont);
		if (FAILED(hr))
			return FALSE;

		hr = cpCPCont->FindConnectionPoint(__uuidof(IMsTscAxEvents), &m_cpConnect);
		if (FAILED(hr))
		{
			return FALSE;
		}

		hr = m_cpConnect->Advise( this , &m_dwEvtCookie);
		if (FAILED(hr))
		{
			m_dwEvtCookie = 0;
			return FALSE;
		}

		return TRUE;
	}

	void	Detach()
	{
		if( (m_dwEvtCookie) && (m_cpConnect) )
			m_cpConnect->Unadvise(m_dwEvtCookie);
		if(m_cpConnect)
			m_cpConnect = NULL;
	}

	//IUnknown Methods
	STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv)
	{
		if (riid == __uuidof(IMsTscAxEvents))
		{
			*ppv = (IMsTscAxEvents *)this;
		}
		else
		{
			*ppv = NULL;
			return E_NOINTERFACE;
		}
		AddRef();
		return S_OK;
	}
   STDMETHOD_(ULONG, AddRef) (void)
   {
		InterlockedIncrement((LONG*)&_ulRefs);
		return _ulRefs;
	}
	STDMETHOD_(ULONG, Release) (void)
	{
		ULONG ulRefs = _ulRefs;
		if (InterlockedDecrement((LONG*)&_ulRefs) == 0)
		{
			delete this;
			return 0;
		}
		return _ulRefs;
	}

	HRESULT OnLoginComplete ( )
	{
		::MessageBoxA(NULL,"Login complete","",0);
	}

	HRESULT OnLogonError (
        long lError )
	{
		::MessageBoxA(NULL,"OnLogonError","",0);
	}
	HRESULT OnDisconnected (
        long discReason )
	{
		::MessageBoxA(NULL,"OnDisconnected","",0);
	}
	//IDispatch Methods

	STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo)          
	{ return E_NOTIMPL;}

	STDMETHOD(GetTypeInfo)(UINT itinfo,LCID lcid,ITypeInfo FAR* FAR* pptinfo)   
	{ return E_NOTIMPL;}

	STDMETHOD(GetIDsOfNames)(REFIID riid,OLECHAR FAR* FAR* rgszNames,UINT cNames,
                             LCID lcid, DISPID FAR* rgdispid)                  
	{ return E_NOTIMPL;}

	STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid,LCID lcid,WORD wFlags,
                      DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult,
                      EXCEPINFO FAR* pexcepinfo,UINT FAR* puArgErr)
	{
		//AfxTrace(_T("Invoke!\n"));
		return S_OK;
	}

protected:
	ULONG		_ulRefs;

	DWORD								m_dwEvtCookie;
	CComPtr<IConnectionPoint>	m_cpConnect;

};

CTscEventSink * pCTscEventSink;
MSTSCLib::IMsRdpClient5* pInterface = NULL;

void RdpConnect()
{
	HRESULT hrInit = CoInitialize(NULL);
	if (FAILED(hrInit)) return; 

	CLSID clsid = __uuidof(MSTSCLib::MsRdpClient5);
	IID iid = __uuidof(MSTSCLib::IMsRdpClient5);

	HRESULT hrInterface = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, (void**)&pInterface);
	 
	
	if (SUCCEEDED(hrInterface))
	{
		pCTscEventSink = new CTscEventSink();
		BOOL b = pCTscEventSink->Attach(pInterface);

		int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
		int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);

		pInterface->PutServer(L"109.83.252.250");
		pInterface->PutFullScreen(true);
		pInterface->PutDesktopWidth(iScreenWidth);
		pInterface->PutDesktopHeight(iScreenHeight);
		pInterface->PutUserName(L"admin");
		pInterface->AdvancedSettings2->PutClearTextPassword(L"12345");
		 
		HRESULT hrConnect = pInterface->Connect();
		if (FAILED(hrConnect))
		{
			MessageBoxW(NULL,L"pInterface->Connect()", L"Error",0);
		}
		else MessageBoxW(NULL,L"pInterface->Connect() Success!!!", L"Success",0);
		 
	}
	else
	{
		wchar_t buf[16] = {0};
		_ltow(hrInterface, buf, 16);
		MessageBoxW(NULL,buf, L"CoCreateInstance failed",0);
	}
	 
}

NullMiracle

@andreybandasov: Привет, у меня та же проблема, функция Connect() всегда успешна, но соединение не было начальным.
Вы это исправили ?

bitov27

Привет! Я не исправляю это, потому что решаю изучить протокол RDP с помощью реализации с открытым исходным кодом-Rdesktop , www.rdesktop.org.

1 Ответов

Рейтинг:
0

Member 11165867

Причина, по которой вы ничего не видите, заключается в том, что вы не реализуете метод Invoke (), вы просто возвращаете S_OK. вы должны кодировать членов dispId, чтобы сообщить вам, когда сервер подключен, logincomplete, loginerror и т. д.


Dave Kreskowiak

Вы понимаете, что этот вопрос был задан три с половиной года назад? Я сомневаюсь, что ОП все еще ищет ответ.

Member 11165867

Дэйв: я знаю, что вопрос старый, однако я публикую его здесь, потому что кто-то другой может искать решение

ankitbtrivedi

Спасибо "Member11165867" за публикацию ответа. Это будут такие люди, как я.