MemoryServer.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. #include "StdAfx.h"
  2. #include "MemoryServer.h"
  3. #include <tlhelp32.h>
  4. #include <Shlwapi.h>
  5. #pragma comment(lib, "shlwapi.lib")
  6. #ifdef __TESET__
  7. DWORD IsAppRunning(LPCTSTR lpszAppDir)
  8. {
  9. if (!lpszAppDir || !PathFileExists(lpszAppDir))
  10. return 0;
  11. TString strAppDir = lpszAppDir;
  12. int nIndex = strAppDir.find_last_of(_T('\\'));
  13. if (nIndex != TString::npos )
  14. strAppDir = strAppDir.substr(nIndex+1);
  15. DWORD dwProcessID = 0;
  16. PROCESSENTRY32 pe32 = { 0 };
  17. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  18. if (hProcessSnap == NULL)
  19. {
  20. ShowSystemErrorInfo(_T("获取进程快照失败"),GetLastError());
  21. return 0;
  22. }
  23. pe32.dwSize = sizeof(PROCESSENTRY32);
  24. if (Process32First(hProcessSnap, &pe32))
  25. {
  26. do
  27. {
  28. // szExeFile只是文件名,不知道是否只有win10才这样;
  29. if (_tcsicmp(strAppDir.c_str(), pe32.szExeFile) == 0)
  30. {
  31. dwProcessID = pe32.th32ProcessID;
  32. break;
  33. }
  34. } while (Process32Next(hProcessSnap, &pe32));
  35. }
  36. CloseHandle(hProcessSnap);
  37. return dwProcessID;
  38. }
  39. bool CloseApp(DWORD dwAppId)
  40. {
  41. if ( dwAppId == 0 )
  42. return false;
  43. HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwAppId);
  44. if (hProcess == NULL)
  45. {
  46. ShowSystemErrorInfo(_T("打开进程失败"),GetLastError());
  47. return false;
  48. }
  49. DWORD dwError;
  50. if (!TerminateProcess(hProcess, 0))
  51. {
  52. dwError = GetLastError();
  53. CloseHandle(hProcess);
  54. hProcess = NULL;
  55. return false;
  56. }
  57. // 等待进程结束响应;
  58. if (WAIT_OBJECT_0 != WaitForSingleObject(hProcess, INFINITE))
  59. {
  60. CloseHandle(hProcess);
  61. return false;
  62. }
  63. CloseHandle(hProcess);
  64. hProcess = NULL;
  65. return true;
  66. }
  67. #endif
  68. CMemoryServer::CMemoryServer(void)
  69. {
  70. }
  71. CMemoryServer::~CMemoryServer(void)
  72. {
  73. }
  74. BOOL CMemoryServer::GetResult()
  75. {
  76. // 获取返回结果;
  77. Sleep(50); // 等待客户端响应;
  78. CMD_Result result;
  79. do
  80. {
  81. Lock(INFINITE);
  82. memcpy(&result, m_pMemory, sizeof(CMD_Result));
  83. Unlock();
  84. //Sleep(100);
  85. } while (result.cmdHead.cmdUser != FALSE);
  86. //WriteTextLog("result:%d",result.bResult);
  87. return result.bResult;
  88. }
  89. BOOL CMemoryServer::StartApp(LPCTSTR lpAppDir)
  90. {
  91. if (!lpAppDir || !PathFileExists(lpAppDir))
  92. return FALSE;
  93. if ( IsAppRunning(lpAppDir) != 0)
  94. return TRUE;
  95. // 启动应用程序;
  96. //ShellExecute(NULL, "open", pszExePath, NULL, NULL, SW_SHOWNORMAL);
  97. SHELLEXECUTEINFO sei;
  98. memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
  99. sei.cbSize = sizeof(SHELLEXECUTEINFO);
  100. sei.hwnd = NULL;
  101. // 普通打开方式:open;若想以管理员身份运行:runas
  102. sei.lpVerb = _T("runas");
  103. //sei.fMask = SEE_MASK_NOCLOSEPROCESS;//不设置,则使用默认值;
  104. sei.lpFile = lpAppDir;
  105. sei.lpParameters = NULL;
  106. sei.lpDirectory = NULL;
  107. sei.nShow = SW_SHOWNORMAL;
  108. sei.hInstApp = NULL;
  109. if ( !ShellExecuteEx(&sei) )
  110. {
  111. DWORD dw = GetLastError();
  112. return FALSE;
  113. }
  114. if (sei.hProcess)
  115. CloseHandle(sei.hProcess);
  116. return TRUE;
  117. }
  118. BOOL CMemoryServer::ShowApp()
  119. {
  120. Lock(INFINITE);
  121. // 命令;
  122. CommandHead cmdHead;
  123. cmdHead.cmdFlag = 0x7F;
  124. cmdHead.cmdType = SHOW_APP;
  125. cmdHead.cmdUser = TRUE;
  126. cmdHead.cmdCRC32 = 0;
  127. // 清空内存;
  128. memset(m_pMemory, 0, MEMERY_SIZE);
  129. // 写入共享内存;
  130. memcpy(m_pMemory, &cmdHead, sizeof(CommandHead));
  131. Unlock();
  132. return TRUE;
  133. }
  134. BOOL CMemoryServer::HideApp()
  135. {
  136. Lock(INFINITE);
  137. // 命令;
  138. CommandHead cmdHead;
  139. cmdHead.cmdFlag = 0x7F;
  140. cmdHead.cmdType = HIDE_APP;
  141. cmdHead.cmdUser = TRUE;
  142. cmdHead.cmdCRC32 = 0;
  143. // 清空内存;
  144. memset(m_pMemory, 0, MEMERY_SIZE);
  145. // 写入共享内存;
  146. memcpy(m_pMemory, &cmdHead, sizeof(CommandHead));
  147. Unlock();
  148. return TRUE;
  149. }
  150. BOOL CMemoryServer::ConnectDevice()
  151. {
  152. Lock(INFINITE);
  153. // 命令;
  154. CMD_ConnectDevice cmd;
  155. cmd.cmdHead.cmdFlag = 0x7F;
  156. cmd.cmdHead.cmdType = CONNECT_DEVICE;
  157. cmd.cmdHead.cmdUser = TRUE;
  158. cmd.cmdHead.cmdCRC32 = 0;
  159. // 清空内存;
  160. memset(m_pMemory, 0, MEMERY_SIZE);
  161. // 写入共享内存;
  162. memcpy(m_pMemory, &cmd, sizeof(CMD_ConnectDevice));
  163. Unlock();
  164. return GetResult();
  165. }
  166. BOOL CMemoryServer::DisconnectDevice()
  167. {
  168. Lock(INFINITE);
  169. // 命令;
  170. CMD_ConnectDevice cmd;
  171. cmd.cmdHead.cmdFlag = 0x7F;
  172. cmd.cmdHead.cmdType = DIS_CONNECT_DEVICE;
  173. cmd.cmdHead.cmdUser = TRUE;
  174. cmd.cmdHead.cmdCRC32 = 0;
  175. // 清空内存;
  176. memset(m_pMemory, 0, MEMERY_SIZE);
  177. // 写入共享内存;
  178. memcpy(m_pMemory, &cmd, sizeof(CMD_ConnectDevice));
  179. Unlock();
  180. return GetResult();
  181. }
  182. BOOL CMemoryServer::StreamOpt(BOOL bStartStreaming)
  183. {
  184. Lock(INFINITE);
  185. // 命令;
  186. CMD_StreamOpt cmd;
  187. cmd.cmdHead.cmdFlag = 0x7F;
  188. cmd.cmdHead.cmdType = bStartStreaming?START_STREAMING:STOP_STREAMING;
  189. cmd.cmdHead.cmdUser = TRUE;
  190. cmd.cmdHead.cmdCRC32 = 0;
  191. cmd.bStartStreaming = bStartStreaming;
  192. // 清空内存;
  193. memset(m_pMemory, 0, MEMERY_SIZE);
  194. // 写入共享内存;
  195. memcpy(m_pMemory, &cmd, sizeof(CMD_StreamOpt));
  196. Unlock();
  197. return GetResult();
  198. }
  199. BOOL CMemoryServer::CaptureImageByCount( int nKeepTime, LPCTSTR lpszSaveDir, LPCTSTR lpszPrefix,unsigned short dwImageType )
  200. {
  201. Lock(INFINITE);
  202. // 命令;
  203. CMD_CaputerImage cmd;
  204. cmd.cmdHead.cmdFlag = 0x7F;
  205. cmd.cmdHead.cmdType = CAPTURE_IMAGE_COUNT;
  206. cmd.cmdHead.cmdUser = TRUE;
  207. cmd.cmdHead.cmdCRC32 = 0;
  208. cmd.dwImageType = dwImageType;
  209. cmd.bContinuType = FALSE;
  210. cmd.nKeepTime = nKeepTime;
  211. cmd.nCaputerCount = 0;
  212. _stprintf_s(cmd.szSaveDir, _T("%s"), lpszSaveDir == NULL ? _T("") : lpszSaveDir);
  213. _stprintf_s(cmd.szPrefix, _T("%s"), lpszPrefix == NULL ? _T("CD750") : lpszPrefix);
  214. Replacepath(cmd.szSaveDir);
  215. // 清空内存;
  216. memset(m_pMemory, 0, MEMERY_SIZE);
  217. // 写入共享内存;
  218. memcpy(m_pMemory, &cmd, sizeof(CMD_CaputerImage));
  219. Unlock();
  220. return GetResult();
  221. }
  222. BOOL CMemoryServer::CaptureSingleImage( LPCTSTR lpszSaveDir, unsigned short dwImageType, BOOL IsAutoName )
  223. {
  224. Lock(INFINITE);
  225. // 命令;
  226. CMD_CaputerImage cmd;
  227. cmd.cmdHead.cmdFlag = 0x7F;
  228. cmd.cmdHead.cmdType = CAPTURE_IMAGE_SINGLE;
  229. cmd.cmdHead.cmdUser = TRUE;
  230. cmd.cmdHead.cmdCRC32 = 0;
  231. cmd.dwImageType = dwImageType;
  232. cmd.IsAutoName = IsAutoName;
  233. cmd.nKeepTime = 1;
  234. cmd.nCaputerCount = 0;
  235. _stprintf_s(cmd.szSaveDir, _T("%s"), lpszSaveDir == NULL ? _T("") : lpszSaveDir);
  236. Replacepath(cmd.szSaveDir);
  237. // 清空内存;
  238. memset(m_pMemory, 0, MEMERY_SIZE);
  239. // 写入共享内存;
  240. memcpy(m_pMemory, &cmd, sizeof(CMD_CaputerImage));
  241. Unlock();
  242. return GetResult();
  243. }
  244. BOOL CMemoryServer::CaptureImageByTime( int nKeepTime, int nCaputerCount, LPCTSTR lpszSaveDir, LPCTSTR lpszPrefix, unsigned short dwImageType)
  245. {
  246. Lock(INFINITE);
  247. // 命令;
  248. CMD_CaputerImage cmd;
  249. cmd.cmdHead.cmdFlag = 0x7F;
  250. cmd.cmdHead.cmdType = CAPTURE_IMAGE_TIME;
  251. cmd.cmdHead.cmdUser = TRUE;
  252. cmd.cmdHead.cmdCRC32 = 0;
  253. cmd.dwImageType = dwImageType;
  254. cmd.bContinuType = TRUE;
  255. cmd.nKeepTime = nKeepTime;
  256. cmd.nCaputerCount = nCaputerCount;
  257. _stprintf_s(cmd.szSaveDir, _T("%s"), lpszSaveDir == NULL ? _T("") : lpszSaveDir);
  258. _stprintf_s(cmd.szPrefix, _T("%s"), lpszPrefix == NULL ? _T("CD750") : lpszPrefix);
  259. Replacepath(cmd.szSaveDir);
  260. // 清空内存;
  261. memset(m_pMemory, 0, MEMERY_SIZE);
  262. // 写入共享内存;
  263. memcpy(m_pMemory, &cmd, sizeof(CMD_CaputerImage));
  264. Unlock();
  265. return GetResult();
  266. }
  267. BOOL CMemoryServer::StopCaptureImage()
  268. {
  269. Lock(INFINITE);
  270. // 命令;
  271. CommandHead cmdHead;
  272. cmdHead.cmdFlag = 0x7F;
  273. cmdHead.cmdType = STOP_CAPTUREIMAGE;
  274. cmdHead.cmdUser = TRUE;
  275. cmdHead.cmdCRC32 = 0;
  276. // 清空内存;
  277. memset(m_pMemory, 0, MEMERY_SIZE);
  278. // 写入共享内存;
  279. memcpy(m_pMemory, &cmdHead, sizeof(CommandHead));
  280. Unlock();
  281. // 等待结果;
  282. // 未实现;
  283. return TRUE;
  284. }
  285. BOOL CMemoryServer::SynCaptureAudio(LPCTSTR lpszSaveDir)
  286. {
  287. Lock(INFINITE);
  288. // 命令;
  289. CMD_CaputerAudio cmd;
  290. cmd.cmdHead.cmdFlag = 0x7F;
  291. cmd.cmdHead.cmdType = SYN_CAPTURE_AUDIO;
  292. cmd.cmdHead.cmdUser = TRUE;
  293. cmd.cmdHead.cmdCRC32 = 0;
  294. cmd.dwDuration = 0;
  295. _stprintf_s(cmd.szSaveDir, _T("%s"), lpszSaveDir);
  296. Replacepath(cmd.szSaveDir);
  297. // 清空内存;
  298. memset(m_pMemory, 0, MEMERY_SIZE);
  299. // 写入共享内存;
  300. memcpy(m_pMemory, &cmd, sizeof(CMD_CaputerAudio));
  301. Unlock();
  302. return GetResult();
  303. }
  304. BOOL CMemoryServer::AsyCaptureAudio(DWORD dwDuration, LPCTSTR lpszSaveDir)
  305. {
  306. Lock(INFINITE);
  307. // 命令;
  308. CMD_CaputerAudio cmd;
  309. cmd.cmdHead.cmdFlag = 0x7F;
  310. cmd.cmdHead.cmdType = ASY_CAPTURE_AUDIO;
  311. cmd.cmdHead.cmdUser = TRUE;
  312. cmd.cmdHead.cmdCRC32 = 0;
  313. cmd.dwDuration = dwDuration;
  314. _stprintf_s(cmd.szSaveDir, _T("%s"), lpszSaveDir);
  315. Replacepath(cmd.szSaveDir);
  316. // 清空内存;
  317. memset(m_pMemory, 0, MEMERY_SIZE);
  318. // 写入共享内存;
  319. memcpy(m_pMemory, &cmd, sizeof(CMD_CaputerAudio));
  320. Unlock();
  321. return GetResult();
  322. }
  323. BOOL CMemoryServer::StopCaptureAudio()
  324. {
  325. Lock(INFINITE);
  326. // 命令;
  327. CommandHead cmdHead;
  328. cmdHead.cmdFlag = 0x7F;
  329. cmdHead.cmdType = STOP_CAPTUREAUDIO;
  330. cmdHead.cmdUser = TRUE;
  331. cmdHead.cmdCRC32 = 0;
  332. // 清空内存;
  333. memset(m_pMemory, 0, MEMERY_SIZE);
  334. // 写入共享内存;
  335. memcpy(m_pMemory, &cmdHead, sizeof(CommandHead));
  336. Unlock();
  337. // 等待结果;
  338. // 未实现;
  339. return TRUE;
  340. }