265 lines
6.5 KiB
C++
265 lines
6.5 KiB
C++
//
|
|
// clshell.cpp
|
|
//
|
|
// Main entry point for the tsc client shell
|
|
// This is an ActiveX client container that hosts an IMsRdpClient control
|
|
//
|
|
// Copyright(C) Microsoft Corporation 1997-2000
|
|
// Author: Nadim Abdo (nadima)
|
|
//
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
#define TRC_GROUP TRC_GROUP_UI
|
|
#define TRC_FILE "clshell"
|
|
#include <atrcapi.h>
|
|
|
|
#include "resource.h"
|
|
#include "tscapp.h"
|
|
|
|
//Unicode wrapper
|
|
#include "wraputl.h"
|
|
|
|
#ifdef OS_WINCE
|
|
#include <ceconfig.h>
|
|
#endif
|
|
|
|
#ifdef OS_WINCE
|
|
DECLARE_TRACKER_VARS();
|
|
#endif
|
|
|
|
//
|
|
// Name: WinMain
|
|
//
|
|
// Purpose: Main procedure
|
|
//
|
|
// Returns: See Windows documentation
|
|
//
|
|
//
|
|
|
|
int WINAPI WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
#ifndef OS_WINCE
|
|
LPSTR lpCmdLine,
|
|
#else
|
|
LPWSTR lpwszCmdLine,
|
|
#endif
|
|
int nCmdShow)
|
|
{
|
|
#ifdef UNIWRAP
|
|
//UNICODE Wrapper intialization has to happen first,
|
|
//before anything ELSE. Even DC_BEGIN_FN, which does tracing
|
|
CUnicodeWrapper uwrp;
|
|
uwrp.InitializeWrappers();
|
|
#endif //UNIWRAP
|
|
|
|
DC_BEGIN_FN("WinMain");
|
|
|
|
UNREFERENCED_PARAMETER(nCmdShow);
|
|
#ifndef OS_WINCE
|
|
UNREFERENCED_PARAMETER(lpCmdLine);
|
|
#else
|
|
UNREFERENCED_PARAMETER(lpwszCmdLine);
|
|
#endif
|
|
|
|
MSG msg;
|
|
#ifndef OS_WINCE
|
|
HRESULT hr;
|
|
#endif
|
|
HACCEL hAccel;
|
|
|
|
#ifndef OS_WINCE
|
|
hr = CoInitialize(NULL);
|
|
if (FAILED(hr))
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
TSRNG_Initialize();
|
|
|
|
//
|
|
// Don't bother failing the load if we can't get accels
|
|
//
|
|
hAccel = (HACCEL)
|
|
LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATORS));
|
|
TRC_ASSERT(hAccel, (TB,_T("Could not load accelerators")));
|
|
|
|
//Ensure CTscApp and all child objects
|
|
//get destroyed before the CoUninitalize call below.
|
|
//Yes, I could use a function but this has much less overheard
|
|
{
|
|
CTscApp app;
|
|
//GetCommandLineW is available on all platforms.
|
|
#ifndef OS_WINCE
|
|
LPWSTR lpszCmd = GetCommandLineW();
|
|
if (lpszCmd)
|
|
{
|
|
//
|
|
// GetCommandLine also includes the app path, so strip that off
|
|
// (walk past the first space)
|
|
//
|
|
if ( *lpszCmd == TEXT('\"') ) {
|
|
//
|
|
// Scan, and skip over, subsequent characters until
|
|
// another double-quote or a null is encountered.
|
|
//
|
|
while ( *++lpszCmd && (*lpszCmd!= TEXT('\"')) );
|
|
//
|
|
// If we stopped on a double-quote (usual case), skip
|
|
// over it.
|
|
//
|
|
if ( *lpszCmd == TEXT('\"') )
|
|
lpszCmd++;
|
|
}
|
|
else {
|
|
while (*lpszCmd > TEXT(' '))
|
|
lpszCmd++;
|
|
}
|
|
|
|
//
|
|
// Skip past any white space preceeding the second token.
|
|
//
|
|
while (*lpszCmd && (*lpszCmd <= TEXT(' '))) {
|
|
lpszCmd++;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
TRC_ERR((TB,_T("cmd line is NULL\n")));
|
|
return 0;
|
|
}
|
|
#else
|
|
/************************************************************************/
|
|
/* On Windows CE, we have only one binary that works for WBT, Maxall, */
|
|
/* Minshell, and Rapier devices. We have to get info about what */
|
|
/* config we're running on and if we have to use software UUIDs here. */
|
|
/************************************************************************/
|
|
CEInitialize();
|
|
g_CEConfig = CEGetConfigType(&g_CEUseScanCodes);
|
|
|
|
if (g_CEConfig == CE_CONFIG_WBT)
|
|
{
|
|
UTREG_UI_DEDICATED_TERMINAL_DFLT = TRUE;
|
|
}
|
|
else
|
|
{
|
|
UTREG_UI_DEDICATED_TERMINAL_DFLT = FALSE;
|
|
}
|
|
RETAILMSG(1,(L"MSTSC client started, g_CEConfig = %d, g_CEUseScanCodes = %d\r\n",g_CEConfig, g_CEUseScanCodes));
|
|
|
|
// CE directly gives us the cmd line in the format we want
|
|
LPWSTR lpszCmd = lpwszCmdLine;
|
|
#endif
|
|
//
|
|
// GetCommandLine also includes the app path, so strip that off
|
|
//
|
|
if(!app.StartShell(hInstance, hPrevInstance, lpszCmd))
|
|
{
|
|
TRC_ERR((TB,_T("Error: app.StartShell returned FALSE. Exiting\n")));
|
|
return 1;
|
|
}
|
|
|
|
HWND hwndMainDlg = app.GetTscDialogHandle();
|
|
|
|
//
|
|
// Main message pump
|
|
//
|
|
while (GetMessage(&msg, 0, 0, 0))
|
|
{
|
|
//
|
|
// Translate accelerators for the main dialog
|
|
// so that CTRL-TAB can be used to switch between
|
|
// tabs.
|
|
//
|
|
if(!TranslateAccelerator(hwndMainDlg, hAccel, &msg))
|
|
{
|
|
if(!IsDialogMessage( hwndMainDlg, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!app.EndShell())
|
|
{
|
|
TRC_ERR((TB,_T("Error: app.EndShell returned FALSE.")));
|
|
}
|
|
}
|
|
|
|
#ifndef OS_WINCE
|
|
CoUninitialize();
|
|
#endif
|
|
|
|
TSRNG_Shutdown();
|
|
|
|
DC_END_FN();
|
|
|
|
#ifdef UNIWRAP
|
|
uwrp.CleanupWrappers();
|
|
#endif //UNIWRAP
|
|
return 0;
|
|
}
|
|
|
|
|
|
#ifndef OS_WINCE
|
|
#ifdef DEBUG
|
|
//
|
|
// Purpose: Redirect all debug messages to our tracing
|
|
//
|
|
extern "C"
|
|
_CRTIMP int __cdecl _CrtDbgReport(int nRptType,
|
|
const char * szFile,
|
|
int nLine,
|
|
const char * szModule,
|
|
const char * szFormat,
|
|
...)
|
|
{
|
|
static CHAR bigBuf[2048];
|
|
va_list vargs;
|
|
|
|
DC_BEGIN_FN("AtlTraceXXX");
|
|
|
|
va_start(vargs, szFormat);
|
|
|
|
wvsprintfA(bigBuf, szFormat, vargs);
|
|
|
|
va_end( vargs );
|
|
|
|
#ifdef OS_WINCE
|
|
#ifndef _CRT_ASSERT
|
|
#define _CRT_ASSERT 2
|
|
#endif
|
|
#endif
|
|
if (_CRT_ASSERT == nRptType)
|
|
{
|
|
#ifdef UNICODE
|
|
TRC_ABORT((TB,_T("_CrtDbgReport. File:%S line:%d - %S"), szFile,
|
|
nLine, bigBuf));
|
|
#else
|
|
TRC_ABORT((TB,_T("_CrtDbgReport. File:%s line:%d - %s"), szFile,
|
|
nLine, bigBuf));
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef UNICODE
|
|
TRC_ERR((TB,_T("_CrtDbgReport. File:%S line:%d - %S"), szFile,
|
|
nLine, bigBuf));
|
|
#else
|
|
TRC_ERR((TB,_T("_CrtDbgReport. File:%s line:%d - %s"), szFile,
|
|
nLine, bigBuf));
|
|
#endif
|
|
}
|
|
|
|
DC_END_FN();
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
#endif //OS_WINCE
|
|
|