WinVNC.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:6k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. //  Copyright (C) 1997, 1998 Olivetti & Oracle Research Laboratory
  2. //
  3. //  This file is part of the VNC system.
  4. //
  5. //  The VNC system is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  18. //  USA.
  19. //
  20. // If the source code for the VNC system is not available from the place 
  21. // whence you received this file, check http://www.orl.co.uk/vnc or contact
  22. // the authors on vnc@orl.co.uk for information on obtaining it.
  23. // WinVNC.cpp
  24. // 24/11/97 WEZ
  25. // WinMain and main WndProc for the new version of WinVNC
  26. ////////////////////////////
  27. // System headers
  28. #include "stdhdrs.h"
  29. ////////////////////////////
  30. // Custom headers
  31. #include "VSocket.h"
  32. #include "WinVNC.h"
  33. #include "vncServer.h"
  34. #include "vncMenu.h"
  35. #include "vncInstHandler.h"
  36. #include "vncService.h"
  37. // Application instance and name
  38. HINSTANCE hAppInstance;
  39. const char *szAppName = "WinVNC";
  40. DWORD mainthreadId;
  41. // WinMain parses the command line and either calls the main App
  42. // routine or, under NT, the main service routine.
  43. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  44. {
  45. #ifdef _DEBUG
  46. {
  47. // Get current flag
  48. int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
  49. // Turn on leak-checking bit
  50. tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  51. // Set flag to the new value
  52. _CrtSetDbgFlag( tmpFlag );
  53. }
  54. #endif
  55. // Save the application instance and main thread id
  56. hAppInstance = hInstance;
  57. mainthreadId = GetCurrentThreadId();
  58. // Initialise the VSocket system
  59. VSocketSystem socksys;
  60. if (!socksys.Initialised())
  61. {
  62. MessageBox(NULL, "Failed to initialise the socket system", szAppName, MB_OK);
  63. return 0;
  64. }
  65. log.Print(LL_STATE, VNCLOG("sockets initialisedn"));
  66. // Make the command-line lowercase and parse it
  67. int i;
  68. for (i = 0; i < strlen(szCmdLine); i++)
  69. {
  70. szCmdLine[i] = tolower(szCmdLine[i]);
  71. }
  72. BOOL argfound = FALSE;
  73. for (i = 0; i < strlen(szCmdLine); i++)
  74. {
  75. if (szCmdLine[i] == ' ')
  76. continue;
  77. argfound = TRUE;
  78. // Now check for command-line arguments
  79. if (strncmp(&szCmdLine[i], winvncRunService, strlen(winvncRunService)) == 0)
  80. {
  81. // Run WinVNC as a service
  82. return vncService::WinVNCServiceMain();
  83. }
  84. if (strncmp(&szCmdLine[i], winvncRunAsUserApp, strlen(winvncRunAsUserApp)) == 0)
  85. {
  86. // WinVNC is being run as a user-level program
  87. return WinVNCAppMain();
  88. }
  89. if (strncmp(&szCmdLine[i], winvncInstallService, strlen(winvncInstallService)) == 0)
  90. {
  91. // Install WinVNC as a service
  92. vncService::InstallService();
  93. i+=strlen(winvncInstallService);
  94. continue;
  95. }
  96. if (strncmp(&szCmdLine[i], winvncRemoveService, strlen(winvncRemoveService)) == 0)
  97. {
  98. // Remove the WinVNC service
  99. vncService::RemoveService();
  100. i+=strlen(winvncRemoveService);
  101. continue;
  102. }
  103. if (strncmp(&szCmdLine[i], winvncShowProperties, strlen(winvncShowProperties)) == 0)
  104. {
  105. // Show the Properties dialog of an existing instance of WinVNC
  106. vncService::ShowProperties();
  107. i+=strlen(winvncShowProperties);
  108. continue;
  109. }
  110. if (strncmp(&szCmdLine[i], winvncShowAbout, strlen(winvncShowAbout)) == 0)
  111. {
  112. // Show the About dialog of an existing instance of WinVNC
  113. vncService::ShowAboutBox();
  114. i+=strlen(winvncShowAbout);
  115. continue;
  116. }
  117. if (strncmp(&szCmdLine[i], winvncKillRunningCopy, strlen(winvncKillRunningCopy)) == 0)
  118. {
  119. // Kill any already running copy of WinVNC
  120. vncService::KillRunningCopy();
  121. i+=strlen(winvncKillRunningCopy);
  122. continue;
  123. }
  124. // Either the user gave the -help option or there is something odd on the cmd-line!
  125. // Show the usage dialog
  126. MessageBox(NULL, winvncUsageText, "WinVNC Usage", MB_OK | MB_ICONINFORMATION);
  127. break;
  128. };
  129. // If no arguments were given then just run
  130. if (!argfound)
  131. return WinVNCAppMain();
  132. return 0;
  133. }
  134. // This is the main routine for WinVNC when running as an application
  135. // (under Windows 95 or Windows NT)
  136. // Under NT, WinVNC can also run as a service.  The WinVNCServerMain routine,
  137. // defined in the vncService header, is used instead when running as a service.
  138. int WinVNCAppMain()
  139. {
  140. // Set this process to be the last application to be shut down.
  141. SetProcessShutdownParameters(0x100, 0);
  142. // Check for previous instances of WinVNC!
  143. vncInstHandler instancehan;
  144. if (!instancehan.Init())
  145. {
  146. // We don't allow multiple instances!
  147. MessageBox(NULL, "Another instance of WinVNC is already running", szAppName, MB_OK);
  148. return 0;
  149. }
  150. // CREATE SERVER
  151. vncServer server;
  152. // Set the name and port number
  153. server.SetName(szAppName);
  154. log.Print(LL_STATE, VNCLOG("server created okn"));
  155. // Create tray icon & menu if we're running as an app
  156. vncMenu *menu = new vncMenu(&server);
  157. if (menu == NULL)
  158. {
  159. log.Print(LL_INTERR, VNCLOG("failed to create tray menun"));
  160. PostQuitMessage(0);
  161. }
  162. // Now enter the message handling loop until told to quit!
  163. MSG msg;
  164. while (GetMessage(&msg, NULL, 0,0) ) {
  165. log.Print(LL_INTINFO, VNCLOG("message %d recievedn"), msg.message);
  166. TranslateMessage(&msg);  // convert key ups and downs to chars
  167. DispatchMessage(&msg);
  168. }
  169. log.Print(LL_STATE, VNCLOG("shutting down servern"));
  170. if (menu != NULL)
  171. delete menu;
  172. return msg.wParam;
  173. };