windows-nt/Source/XPSP1/NT/termsrv/remdsk/client/rdhost/remotedesktopclienthost.cpp
2020-09-26 16:20:57 +08:00

170 lines
2.9 KiB
C++

/*+
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
RDPRemoteDesktopClientHost
Abstract:
Author:
Tad Brockway 02/00
Revision History:
--*/
#include "stdafx.h"
#ifdef TRC_FILE
#undef TRC_FILE
#endif
#define TRC_FILE "_crdph"
#include "RDCHost.h"
#include "TSRDPRemoteDesktopClient.h"
#include "RemoteDesktopClientHost.h"
#include <RemoteDesktopUtils.h>
///////////////////////////////////////////////////////
//
// CRemoteDesktopClientHost Methods
//
HRESULT
CRemoteDesktopClientHost::FinalConstruct()
{
DC_BEGIN_FN("CRemoteDesktopClientHost::FinalConstruct");
HRESULT hr = S_OK;
if (!AtlAxWinInit()) {
TRC_ERR((TB, L"AtlAxWinInit failed."));
hr = E_FAIL;
}
DC_END_FN();
return hr;
}
HRESULT
CRemoteDesktopClientHost::Initialize(
LPCREATESTRUCT pCreateStruct
)
/*++
Routine Description:
Final Initialization
Arguments:
pCreateStruct - WM_CREATE, create struct.
Return Value:
S_OK on success. Otherwise, an error code is returned.
--*/
{
DC_BEGIN_FN("CRemoteDesktopClientHost::Initialize");
RECT rcClient = { 0, 0, pCreateStruct->cx, pCreateStruct->cy };
HRESULT hr;
IUnknown *pUnk = NULL;
ASSERT(!m_Initialized);
//
// Create the client Window.
//
m_ClientWnd = m_ClientAxView.Create(
m_hWnd, rcClient, REMOTEDESKTOPCLIENT_TEXTGUID,
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0
);
if (m_ClientWnd == NULL) {
hr = HRESULT_FROM_WIN32(GetLastError());
TRC_ERR((TB, L"Window Create: %08X", GetLastError()));
goto CLEANUPANDEXIT;
}
ASSERT(::IsWindow(m_ClientWnd));
//
// Get IUnknown
//
hr = AtlAxGetControl(m_ClientWnd, &pUnk);
if (!SUCCEEDED(hr)) {
TRC_ERR((TB, L"AtlAxGetControl: %08X", hr));
pUnk = NULL;
goto CLEANUPANDEXIT;
}
//
// Get the client control.
//
hr = pUnk->QueryInterface(__uuidof(ISAFRemoteDesktopClient), (void**)&m_Client);
if (!SUCCEEDED(hr)) {
TRC_ERR((TB, L"QueryInterface: %08X", hr));
goto CLEANUPANDEXIT;
}
m_Initialized = TRUE;
CLEANUPANDEXIT:
//
// m_Client keeps our reference to the client object until
// the destructor is called.
//
if (pUnk != NULL) {
pUnk->Release();
}
DC_END_FN();
return hr;
}
STDMETHODIMP
CRemoteDesktopClientHost::GetRemoteDesktopClient(
ISAFRemoteDesktopClient **client
)
/*++
Routine Description:
Arguments:
Return Value:
S_OK on success. Otherwise, an error code is returned.
--*/
{
DC_BEGIN_FN("CRemoteDesktopClientHost::GetRemoteDesktopClient");
HRESULT hr;
ASSERT(m_Initialized);
if (m_Client != NULL) {
hr = m_Client->QueryInterface(__uuidof(ISAFRemoteDesktopClient), (void **)client);
}
else {
hr = E_FAIL;
}
DC_END_FN();
return hr;
}