UB530SDK.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. // UB530SDK.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "Python.h"
  5. #include "MemoryServer.h"
  6. CMemoryServer g_ub530;
  7. PyObject *g_list = NULL;
  8. /************************************************************************/
  9. /* 函数:[7/4/2018 Wang];
  10. /* 描述:进程是否在运行;
  11. /* 参数:;
  12. /* [IN] :执行文件路径;
  13. /* [OUT] :;
  14. /* [IN/OUT] :;
  15. /* 返回:成功返回进程ID(!= 0);
  16. /* 注意:;
  17. /* 示例:;
  18. /*
  19. /* 修改:;
  20. /* 日期:;
  21. /* 内容:;
  22. /************************************************************************/
  23. static PyObject* IsAppRunning(PyObject *self, PyObject *args)
  24. {
  25. // 应用程序路径;
  26. const char* pszExePath = NULL;
  27. if (!PyArg_ParseTuple(args, "s", &pszExePath))
  28. return NULL;
  29. return Py_BuildValue("i", IsAppRunning(pszExePath));
  30. }
  31. /************************************************************************/
  32. /* 函数:[7/2/2018 Wang];
  33. /* 描述:启动进程;
  34. /* 参数:;
  35. /* [IN] :执行文件完整路径,并且默认打开设备索引值为0的设备;
  36. /* [OUT] :;
  37. /* [IN/OUT] :;
  38. /* 返回:成功返回1,失败返回0;
  39. /* 注意:;
  40. /* 示例:;
  41. /*
  42. /* 修改:;
  43. /* 日期:;
  44. /* 内容:;
  45. /************************************************************************/
  46. static PyObject* StartApp(PyObject *self, PyObject *args)
  47. {
  48. // 应用程序路径;
  49. const char* pszExePath = NULL;
  50. if (!PyArg_ParseTuple(args, "s", &pszExePath))
  51. return NULL;
  52. // 参数有效性判断;
  53. if (!pszExePath || !PathFileExists(pszExePath))
  54. return Py_BuildValue("b",0);
  55. // 进程是否存在;
  56. _stprintf_s(g_szAppDir, _T("%s"), pszExePath);
  57. if ( (g_dwAppId = IsAppRunning(g_szAppDir)) != 0)
  58. return Py_BuildValue("b",1);
  59. // 启动应用程序;
  60. //ShellExecute(NULL, "open", pszExePath, NULL, NULL, SW_SHOWNORMAL);
  61. SHELLEXECUTEINFO sei;
  62. memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
  63. sei.cbSize = sizeof(SHELLEXECUTEINFO);
  64. sei.hwnd = NULL;
  65. // 普通打开方式:open;若想以管理员身份运行:runas
  66. sei.lpVerb = _T("runas");
  67. //sei.fMask = SEE_MASK_NOCLOSEPROCESS;//不设置,则使用默认值;
  68. sei.lpFile = g_szAppDir;
  69. sei.lpParameters = NULL;
  70. sei.lpDirectory = NULL;
  71. sei.nShow = SW_SHOWNORMAL;
  72. sei.hInstApp = NULL;
  73. if ( !ShellExecuteEx(&sei) )
  74. {
  75. DWORD dw = GetLastError();
  76. return Py_BuildValue("b",0);
  77. }
  78. if (sei.hProcess)
  79. CloseHandle(sei.hProcess);
  80. // 打开索引为0的设备;
  81. // 待实现;
  82. return Py_BuildValue("b",1);
  83. }
  84. /************************************************************************/
  85. /* 函数:[7/2/2018 Wang];
  86. /* 描述:关闭进程;
  87. /* 参数:;
  88. /* 返回:成功结束进程返回1,失败返回0;
  89. /* 注意:Win7以上系统,如果宿主程序不是以管理权限运行,是无权附加进程并关闭进程;
  90. /* 示例:;
  91. /*
  92. /* 修改:;
  93. /* 日期:;
  94. /* 内容:;
  95. /************************************************************************/
  96. static PyObject* StopApp(PyObject *self, PyObject *args)
  97. {
  98. // 结束进程;
  99. #if 1
  100. if ( (g_dwAppId = IsAppRunning(g_szAppDir)) != 0)
  101. {
  102. if ( !CloseApp(g_dwAppId) )
  103. return Py_BuildValue("b",0);
  104. }
  105. #else
  106. // 调用App的Close函数;
  107. #endif
  108. return Py_BuildValue("b",1); // 返回None;
  109. }
  110. /************************************************************************/
  111. /* 函数:[7/2/2018 Wang];
  112. /* 描述:连接设备,默认连接索引为0的设备;
  113. /* 参数:;
  114. /* [IN] :设备索引值(从0开始,默认值为0);
  115. /* 返回:void;
  116. /* 注意:连接设备需要响应时间,测试结果为大概3秒;
  117. /* 示例:;
  118. /*
  119. /* 修改:;
  120. /* 日期:;
  121. /* 内容:;
  122. /************************************************************************/
  123. static PyObject* ConnectDevice(PyObject *self, PyObject *args)
  124. {
  125. BOOL bRet = g_ub530.ConnectDevice();
  126. return Py_BuildValue("b", bRet);
  127. }
  128. /************************************************************************/
  129. /* 函数:[7/2/2018 Wang];
  130. /* 描述:断开设备,默认索引为0的设备;
  131. /* 参数:;
  132. /* [IN] :设备索引值(从0开始,默认值为0);
  133. /* 返回:void;
  134. /* 注意:;
  135. /* 示例:;
  136. /*
  137. /* 修改:;
  138. /* 日期:;
  139. /* 内容:;
  140. /************************************************************************/
  141. static PyObject* DisconnectDevice(PyObject *self, PyObject *args)
  142. {
  143. BOOL bRet = g_ub530.DisconnectDevice();
  144. return Py_BuildValue("b", bRet);
  145. }
  146. /************************************************************************/
  147. /* 函数:[7/2/2018 Wang];
  148. /* 描述:开始/停止 流;
  149. /* 参数:;
  150. /* [IN] :true开始,false停止;
  151. /* 返回:void;
  152. /* 注意:操作设备需要响应时间,测试结果为大概3秒;
  153. /* 示例:;
  154. /*
  155. /* 修改:;
  156. /* 日期:;
  157. /* 内容:;
  158. /************************************************************************/
  159. static PyObject* StreamOption(PyObject *self, PyObject *args)
  160. {
  161. BOOL bStartStreaming = FALSE;
  162. if (!PyArg_ParseTuple(args, "b", &bStartStreaming))
  163. return NULL;
  164. BOOL bRet = g_ub530.StreamOpt(bStartStreaming);
  165. return Py_BuildValue("b", bRet);
  166. }
  167. /************************************************************************/
  168. /* 函数:[7/2/2018 Wang];
  169. /* 描述:显示窗口;
  170. /* 参数:;
  171. /* [IN] :;
  172. /* [OUT] :;
  173. /* [IN/OUT] :;
  174. /* 返回:void;
  175. /* 注意:;
  176. /* 示例:;
  177. /*
  178. /* 修改:;
  179. /* 日期:;
  180. /* 内容:;
  181. /************************************************************************/
  182. static PyObject* ShowApp(PyObject *self, PyObject *args)
  183. {
  184. g_ub530.ShowApp();
  185. return Py_BuildValue(""); // 返回None;
  186. }
  187. /************************************************************************/
  188. /* 函数:[7/2/2018 Wang];
  189. /* 描述:隐藏窗口;
  190. /* 参数:;
  191. /* [IN] :;
  192. /* [OUT] :;
  193. /* [IN/OUT] :;
  194. /* 返回:void;
  195. /* 注意:;
  196. /* 示例:;
  197. /*
  198. /* 修改:;
  199. /* 日期:;
  200. /* 内容:;
  201. /************************************************************************/
  202. static PyObject* HideApp(PyObject *self, PyObject *args)
  203. {
  204. g_ub530.HideApp();
  205. return Py_BuildValue(""); // 返回None;
  206. }
  207. /************************************************************************/
  208. /* 函数:[7/2/2018 Wang];
  209. /* 描述:抓图,持续方式以张数为单位;
  210. /* 参数:;
  211. /* [IN] :设备索引(从0开始);
  212. /* [IN] :图片保存路径;
  213. /* [IN] :图片保存格式,默认为PNG;
  214. /* [IN] :包括叠加内容,默认true;
  215. /* [IN-4] :采集区域,上、下、左、右4个参数;
  216. /* [IN] :截图张数,默认1;
  217. /* 返回:void;
  218. /* 注意:接口返回调用成功,并非表明完成截图,只是表示设备完成指令响应,并未完成截图工作;
  219. /* 示例:;
  220. /*
  221. /* 修改:;
  222. /* 日期:;
  223. /* 内容:;
  224. /************************************************************************/
  225. static PyObject* CaptureImageByCount(PyObject *self, PyObject *args)
  226. {
  227. // 图片格式;
  228. unsigned short dwImageType = 3;
  229. // 叠加内容;
  230. BOOL bOverlayMix = TRUE;
  231. // 采集区域;
  232. int nTop = 0, nLeft = 0, nRight = 0, nBottom = 0;
  233. // 持续时间;
  234. int nKeepTime = 10;
  235. // 保存路径;
  236. const char* lpszSaveDir = NULL;
  237. // 文件前缀;
  238. const char* lpszPrefix = NULL;
  239. if (!PyArg_ParseTuple(args, "issh", &nKeepTime, &lpszSaveDir, &lpszPrefix, &dwImageType))
  240. return NULL;
  241. BOOL bRet = g_ub530.CaptureImageByCount( nKeepTime, lpszSaveDir, lpszPrefix, dwImageType);
  242. return Py_BuildValue("b", bRet);
  243. }
  244. /************************************************************************/
  245. /* 函数:[7/2/2018 Wang];
  246. /* 描述:单张抓图,持续方式以张数为单位;
  247. /* 参数:;
  248. /* [IN] :设备索引(从0开始);
  249. /* [IN] :图片保存路径;
  250. /* [IN] :图片保存格式,默认为PNG;
  251. /* [IN] :包括叠加内容,默认true;
  252. /* [IN-4] :采集区域,上、下、左、右4个参数;
  253. /* [IN] :截图张数,默认1;
  254. /* 返回:void;
  255. /* 注意:;
  256. /* 示例:;
  257. /*
  258. /* 修改:;
  259. /* 日期:;
  260. /* 内容:;
  261. /************************************************************************/
  262. static PyObject* CaptureSingleImage(PyObject *self, PyObject *args)
  263. {
  264. // 图片格式;
  265. unsigned short dwImageType = 3;
  266. // 叠加内容;
  267. BOOL bOverlayMix = TRUE;
  268. // 采集区域;
  269. int nTop = 0, nLeft = 0, nRight = 0, nBottom = 0;
  270. // 持续时间;
  271. int nKeepTime = 10;
  272. // 保存路径;
  273. const char* lpszSaveDir = NULL;
  274. if (!PyArg_ParseTuple(args, "sh", &lpszSaveDir, &dwImageType))
  275. return NULL;
  276. BOOL bRet = g_ub530.CaptureSingleImage(lpszSaveDir, dwImageType);
  277. return Py_BuildValue("b", bRet);
  278. }
  279. /************************************************************************/
  280. /* 函数:[7/2/2018 Wang];
  281. /* 描述:抓图,持续方式以秒为单位;
  282. /* 参数:;
  283. /* [IN] :设备索引(从0开始);
  284. /* [IN] :图片保存路径;
  285. /* [IN] :图片保存格式,默认为PNG;
  286. /* [IN] :包括叠加内容,默认true;
  287. /* [IN-4] :采集区域,上、下、左、右4个参数;
  288. /* [IN] :持续时间,默认1000ms;
  289. /* [IN] :每秒抓取张数,默认10张;
  290. /* 返回:void;
  291. /* 注意:;
  292. /* 示例:;
  293. /*
  294. /* 修改:;
  295. /* 日期:;
  296. /* 内容:;
  297. /************************************************************************/
  298. static PyObject* CaptureImageByTime(PyObject *self, PyObject *args)
  299. {
  300. // 图片格式;
  301. unsigned short dwImageType = 3;
  302. // 叠加内容;
  303. BOOL bOverlayMix = TRUE;
  304. // 采集区域;
  305. int nTop = 0, nLeft = 0, nRight = 0, nBottom = 0;
  306. // 持续时间;
  307. int nKeepTime = 10;
  308. // 每秒抓取张数;
  309. int nCaputerCount = 0;
  310. // 保存路径;
  311. const char* lpszSaveDir = NULL;
  312. // 文件前缀;
  313. const char* lpszPrefix = NULL;
  314. if (!PyArg_ParseTuple(args, "iissh", &nKeepTime, &nCaputerCount, &lpszSaveDir, &lpszPrefix, &dwImageType))
  315. return NULL;
  316. BOOL bRet = g_ub530.CaptureImageByTime(nKeepTime, nCaputerCount, lpszSaveDir, lpszPrefix, dwImageType);
  317. return Py_BuildValue("b", bRet);
  318. }
  319. /************************************************************************/
  320. /* 函数:[7/2/2018 Wang];
  321. /* 描述:停止截图,暂未使用;
  322. /* 参数:;
  323. /* [IN] :;
  324. /* 返回:void;
  325. /* 注意:;
  326. /* 示例:;
  327. /*
  328. /* 修改:;
  329. /* 日期:;
  330. /* 内容:;
  331. /************************************************************************/
  332. static PyObject* StopCaptureImage(PyObject *self, PyObject *args)
  333. {
  334. g_ub530.StopCaptureImage();
  335. return Py_BuildValue(""); // 返回None;
  336. }
  337. /************************************************************************/
  338. /* 函数:[7/2/2018 Wang];
  339. /* 描述:同步视频录制;
  340. /* 参数:;
  341. /* [IN] :视屏的保存路径;
  342. /* [IN] :录制时间长度,以秒为单位(约值);
  343. /* 返回:void;
  344. /* 注意:;
  345. /* 示例:;
  346. /*
  347. /* 修改:;
  348. /* 日期:;
  349. /* 内容:;
  350. /************************************************************************/
  351. static PyObject* StartCaptureAudio(PyObject *self, PyObject *args)
  352. {
  353. // 保存路径;
  354. const char* lpszSaveDir = NULL;
  355. if (!PyArg_ParseTuple(args, "s", &lpszSaveDir))
  356. return NULL;
  357. BOOL bRet = g_ub530.SynCaptureAudio(lpszSaveDir);
  358. return Py_BuildValue("b", bRet);
  359. }
  360. /************************************************************************/
  361. /* 函数:[7/2/2018 Wang];
  362. /* 描述:停止录制视频;
  363. /* 参数:;
  364. /* [IN] :;
  365. /* 返回:void;
  366. /* 注意:;
  367. /* 示例:;
  368. /*
  369. /* 修改:;
  370. /* 日期:;
  371. /* 内容:;
  372. /************************************************************************/
  373. static PyObject* StopCaptureAudio(PyObject *self, PyObject *args)
  374. {
  375. g_ub530.StopCaptureAudio();
  376. return Py_BuildValue(""); // 返回None;
  377. }
  378. /************************************************************************/
  379. /* 函数:[7/2/2018 Wang];
  380. /* 描述:异步视频录制;
  381. /* 参数:;
  382. /* [IN] :视屏的保存路径;
  383. /* [IN] :录制时间长度,以秒为单位(约值);
  384. /* 返回:void;
  385. /* 注意:;
  386. /* 示例:;
  387. /*
  388. /* 修改:;
  389. /* 日期:;
  390. /* 内容:;
  391. /************************************************************************/
  392. static PyObject* AsyCaptureAudio(PyObject *self, PyObject *args)
  393. {
  394. // 持续时间;
  395. DWORD dwKeepTime = 10;
  396. // 保存路径;
  397. const char* lpszSaveDir = NULL;
  398. if (!PyArg_ParseTuple(args, "ls", &dwKeepTime, &lpszSaveDir))
  399. return NULL;
  400. BOOL bRet = g_ub530.AsyCaptureAudio(dwKeepTime, lpszSaveDir);
  401. return Py_BuildValue("b", bRet);
  402. }
  403. /************************************************************************/
  404. /* 函数:[8/13/2018 jianfeng1.wang];
  405. /* 描述:;
  406. /* 参数:;
  407. /* [IN] :;
  408. /* [OUT] :;
  409. /* [IN/OUT] :;
  410. /* 返回:void;
  411. /* 注意:;
  412. /* 示例:;
  413. /*
  414. /* 修改:;
  415. /* 日期:;
  416. /* 内容:;
  417. /************************************************************************/
  418. static PyObject* GetCaptureImageList(PyObject *self, PyObject *args)
  419. {
  420. // 保存路径;
  421. const char* lpszImgDir = NULL;
  422. if (!PyArg_ParseTuple(args, "s", &lpszImgDir))
  423. return NULL;
  424. vector<TString> files;
  425. findfile(lpszImgDir, files);
  426. if (g_list != NULL)
  427. {
  428. Py_DECREF(g_list);
  429. g_list = NULL;
  430. }
  431. int i = 0;
  432. g_list = PyList_New(0);
  433. for (vector<TString>::iterator it = files.begin(); it != files.end(); it++)
  434. {
  435. PyList_Append(g_list, PyString_FromString(it->c_str()));
  436. }
  437. return g_list;
  438. }
  439. // 描述方法,暴露给python的函数;
  440. static PyMethodDef UB530_Methods[] ={
  441. {"IsAppRunning",IsAppRunning,METH_VARARGS,"程序是否在运行"},
  442. {"StartApp", StartApp, METH_VARARGS, "启动进程"},
  443. {"StopApp", StopApp, METH_VARARGS, "关闭进程"},
  444. {"ConnectDevice", ConnectDevice, METH_VARARGS, "连接设备"},
  445. {"DisconnectDevice", DisconnectDevice, METH_VARARGS, "断开设备"},
  446. {"StreamOption",StreamOption,METH_VARARGS,"流操作"},
  447. {"ShowApp", ShowApp, METH_VARARGS, "显示窗口"},
  448. {"HideApp", HideApp, METH_VARARGS, "隐藏窗口"},
  449. {"CaptureImageByCount", CaptureImageByCount, METH_VARARGS, "以张数为单位抓图"},
  450. {"CaptureImageByTime", CaptureImageByTime, METH_VARARGS, "以时间为单位抓图"},
  451. {"CaptureSingleImage", CaptureSingleImage, METH_VARARGS, "单张抓图"},
  452. {"StopCaptureImage", StopCaptureImage, METH_VARARGS, "停止抓图"},
  453. {"StartCaptureAudio", StartCaptureAudio, METH_VARARGS, "同步视屏录制"},
  454. {"StopCaptureAudio", StopCaptureAudio, METH_VARARGS, "同步视屏录制"},
  455. {"AsyCaptureAudio", AsyCaptureAudio, METH_VARARGS, "异步视屏录制"},
  456. {"GetCaptureImageList", GetCaptureImageList, METH_VARARGS, "返回目录文件列表"},
  457. {NULL,NULL}
  458. };
  459. // 初始模块;//格式:init<模块名称>
  460. PyMODINIT_FUNC initUB530SDK()
  461. {
  462. // 初始化共享内存;
  463. g_ub530.InitMemery();
  464. // 进程提权;
  465. if ( !GetDebugPriv() )
  466. WriteTextLog(_T("提权失败"));
  467. // 初始化pyd函数列表;
  468. PyObject *m,*d;
  469. m = Py_InitModule("UB530SDK", UB530_Methods);
  470. d = PyModule_GetDict(m);
  471. }