// // 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 #include "resource.h" #include "tscapp.h" //Unicode wrapper #include "wraputl.h" #ifdef OS_WINCE #include #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