main.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: main.c 341 2005-11-16 00:15:54Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. static const tchar_t ProgramName[] = T("TCPMP");
  25. static const tchar_t ProgramVersion[] = 
  26. #include "../version"
  27. ;
  28. #ifndef STRICT
  29. #define STRICT
  30. #endif
  31. #include <windows.h>
  32. #if defined(TARGET_WINCE)
  33. #define TWIN(a) L ## a
  34. extern int ProgramId;
  35. #else
  36. #define TWIN(a) a
  37. static int ProgramId = 0;
  38. #endif
  39. // don't want to use common.dll, but don't want to collide with DLL import function either
  40. #define tcscpy_s _tcscpy_s
  41. #if !defined(NO_PLUGINS) || defined(NDEBUG)
  42. static void tcscpy_s(tchar_t* Out,int OutLen,const tchar_t* In)
  43. {
  44. if (OutLen>0)
  45. {
  46. int n = min((int)tcslen(In),OutLen-1);
  47. memcpy(Out,In,n*sizeof(tchar_t));
  48. Out[n] = 0;
  49. }
  50. }
  51. #endif
  52. #ifdef NDEBUG
  53. static BOOL CALLBACK EnumWindowsProc(HWND Wnd,LPARAM Param)
  54. {
  55. HWND* p = (HWND*)Param;
  56. if (GetWindow(Wnd,GW_OWNER) == *p)
  57. {
  58. *p = Wnd;
  59. return 0;
  60. }
  61. return 1;
  62. }
  63. static bool_t FindRunning(const tchar_t* CmdLine)
  64. {
  65. HWND Wnd;
  66. tchar_t ClassName[32];
  67. int n = tcslen(ProgramName);
  68. tcscpy_s(ClassName,TSIZEOF(ClassName),ProgramName);
  69. tcscpy_s(ClassName+n,TSIZEOF(ClassName)-n,T("_Win"));
  70. Wnd = FindWindow(ClassName, NULL);
  71. if (Wnd)
  72. {
  73. HWND WndMain = Wnd;
  74. while (!IsWindowEnabled(Wnd))
  75. {
  76. HWND Last = Wnd;
  77. EnumWindows(EnumWindowsProc,(LPARAM)&Wnd);
  78. if (Wnd == Last)
  79. break;
  80. }
  81. SetForegroundWindow(Wnd);
  82. if (CmdLine && CmdLine[0])
  83. {
  84. COPYDATASTRUCT Data;
  85. Data.dwData = 0;
  86. Data.cbData = (tcslen(CmdLine)+1)*sizeof(tchar_t);
  87. Data.lpData = (PVOID)CmdLine;
  88. SendMessage(WndMain,WM_COPYDATA,(WPARAM)WndMain,(LPARAM)&Data);
  89. }
  90. return 1;
  91. }
  92. return 0;
  93. }
  94. #endif
  95. #ifdef NO_PLUGINS
  96. extern void Main(const tchar_t* Name,const tchar_t* Version,int Id,const tchar_t* CmdLine);
  97. #else
  98. static HANDLE Load(const tchar_t* Name)
  99. {
  100. HANDLE Module;
  101. tchar_t Path[MAXPATH];
  102. tchar_t *s;
  103. GetModuleFileName(NULL,Path,MAXPATH);
  104. s = tcsrchr(Path,'\');
  105. if (s) s[1]=0;
  106. tcscpy_s(Path+tcslen(Path),TSIZEOF(Path)-tcslen(Path),Name);
  107. Module = LoadLibrary(Path);
  108. if (!Module)
  109. Module = LoadLibrary(Name);
  110. return Module;
  111. }
  112. #endif
  113. #if !defined(TARGET_WINCE) && defined(UNICODE)
  114. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hParent,LPSTR CmdA,int CmdShow)
  115. {
  116. WCHAR Cmd[2048];
  117. mbstowcs(Cmd,CmdA,sizeof(Cmd)/sizeof(WCHAR)); //!!!
  118. #else
  119. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hParent,TCHAR* Cmd,int CmdShow)
  120. {
  121. #endif
  122. #ifndef NDEBUG
  123. // DLLTest(); // just to help debugging plugins. comment out if not needed
  124. Context();
  125. #endif
  126. #if defined(TARGET_WINCE) && defined(ARM)
  127. if (ProgramId == 2)
  128. {
  129. OSVERSIONINFO Ver;
  130. Ver.dwOSVersionInfoSize = sizeof(Ver);
  131. GetVersionEx(&Ver);
  132. if (Ver.dwMajorVersion*100 + Ver.dwMinorVersion >= 421)
  133. {
  134. // old shell menu not supported after WM2003SE
  135. MessageBox(NULL,T("This ARM_CE2 version of the player is not compatible with this device. Please install ARM_CE3 version."),NULL,MB_OK|MB_ICONERROR); 
  136. return 1; 
  137. }
  138. }
  139. #endif
  140. #ifdef NDEBUG
  141. if (!FindRunning(Cmd))
  142. {
  143. HANDLE Handle = CreateMutex(NULL,FALSE,ProgramName);
  144. if (GetLastError() != ERROR_ALREADY_EXISTS)
  145. #endif
  146. {
  147. #ifndef NO_PLUGINS
  148. HMODULE Module;
  149. SetCursor(LoadCursor(NULL, IDC_WAIT));
  150. Module = Load(T("interface.plg"));
  151. if (Module)
  152. {
  153. void (*Main)(const tchar_t* Name,const tchar_t* Version,int Id,const tchar_t* CmdLine);
  154. *(FARPROC*)&Main = GetProcAddress(Module,TWIN("Main"));
  155. if (!Main)
  156. *(FARPROC*)&Main = GetProcAddress(Module,TWIN("_Main@16"));
  157. if (Main)
  158. Main(ProgramName,ProgramVersion,ProgramId,Cmd);
  159. FreeLibrary(Module);
  160. }
  161. #else
  162. Main(ProgramName,ProgramVersion,ProgramId,Cmd);
  163. #endif
  164. #ifdef NDEBUG
  165. CloseHandle(Handle);
  166. #endif
  167. SetCursor(LoadCursor(NULL, IDC_ARROW));
  168. }
  169. #ifdef NDEBUG
  170. }
  171. #endif
  172. return 0;
  173. }