CCommonTools.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. #include "CCommonTools.h"
  2. #include <QDateTime>
  3. #include <QUuid>
  4. #include <QProcess>
  5. #include <QStringList>
  6. #include <QCryptographicHash>
  7. #include "logproc.h"
  8. #include <random>
  9. #include <QFileInfo>
  10. #include <QDir>
  11. #include <windows.h>
  12. #include <tlhelp32.h>// for CreateToolhelp32Snapshot
  13. #include <Psapi.h> // for GetModuleFileNameEx
  14. #include <Dshow.h>
  15. #define FORMAT_PATH(path) path.replace('\\','/').toLower()
  16. #ifdef __GNUC__
  17. #include <cpuid.h>
  18. #elif defined(_MSC_VER)
  19. #if _MSC_VER >= 1400
  20. #include <intrin.h>
  21. #endif
  22. #else
  23. #error Only supports MSVC or GCC
  24. #endif
  25. namespace CCommonTools
  26. {
  27. bool IsWow64()
  28. {
  29. bool bRetVal = false;
  30. SYSTEM_INFO si = { 0 };
  31. typedef VOID (WINAPI *LPFN_PGNSI) (LPSYSTEM_INFO);
  32. LPFN_PGNSI pGNSI = (LPFN_PGNSI) GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetNativeSystemInfo");
  33. if (pGNSI == NULL)
  34. {
  35. return false;
  36. }
  37. pGNSI(&si);
  38. if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
  39. si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
  40. {
  41. bRetVal = true;
  42. }
  43. else
  44. {
  45. //32 位操作系统
  46. }
  47. return bRetVal;
  48. }
  49. int getDisplayNumber()
  50. {
  51. int iNumber = 0;
  52. bool bFlag = true;
  53. DISPLAY_DEVICE dd;
  54. ZeroMemory(&dd,sizeof(dd));
  55. dd.cb =sizeof(dd);
  56. DEVMODE devMode;
  57. ZeroMemory(&devMode,sizeof(devMode)); devMode.dmSize=sizeof(devMode);
  58. do
  59. {
  60. bFlag = EnumDisplayDevices(NULL, iNumber,&dd,0);
  61. bFlag = bFlag && EnumDisplaySettings(dd.DeviceName,ENUM_CURRENT_SETTINGS,&devMode);
  62. if(bFlag)
  63. {
  64. iNumber +=1;
  65. }
  66. }
  67. while(bFlag);
  68. return iNumber;
  69. }
  70. void getcpuid(unsigned int CPUInfo[4], unsigned int InfoType)
  71. {
  72. #if defined(__GNUC__)// GCC
  73. __cpuid(InfoType, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
  74. #elif defined(_MSC_VER)// MSVC
  75. #if _MSC_VER >= 1400 //VC2005才支持__cpuid
  76. __cpuid((int*)(void*)CPUInfo, (int)(InfoType));
  77. #else //其他使用getcpuidex
  78. getcpuidex(CPUInfo, InfoType, 0);
  79. #endif
  80. #endif
  81. }
  82. void getcpuidex(unsigned int CPUInfo[4], unsigned int InfoType, unsigned int ECXValue)
  83. {
  84. #if defined(_MSC_VER) // MSVC
  85. #if defined(_WIN64) // 64位下不支持内联汇编. 1600: VS2010, 据说VC2008 SP1之后才支持__cpuidex.
  86. __cpuidex((int*)(void*)CPUInfo, (int)InfoType, (int)ECXValue);
  87. #else
  88. if (NULL==CPUInfo) return;
  89. _asm{
  90. // load. 读取参数到寄存器.
  91. mov edi, CPUInfo;
  92. mov eax, InfoType;
  93. mov ecx, ECXValue;
  94. // CPUID
  95. cpuid;
  96. // save. 将寄存器保存到CPUInfo
  97. mov [edi], eax;
  98. mov [edi+4], ebx;
  99. mov [edi+8], ecx;
  100. mov [edi+12], edx;
  101. }
  102. #endif
  103. #endif
  104. }
  105. QString get_cpuId()
  106. {
  107. QString cpu_id = "";
  108. unsigned int dwBuf[4]={0};
  109. unsigned long long ret = 0;
  110. getcpuid(dwBuf, 1);
  111. ret = dwBuf[3];
  112. ret = ret << 32;
  113. QString str0 = QString::number(dwBuf[3], 16).toUpper();
  114. QString str0_1 = str0.rightJustified(8,'0');//这一句的意思是前面补0,但是我遇到的情况是这里都填满了
  115. QString str1 = QString::number(dwBuf[0], 16).toUpper();
  116. QString str1_1 = str1.rightJustified(8,'0');//这里必须在前面补0,否则不会填满数据
  117. //cpu_id = cpu_id + QString::number(dwBuf[0], 16).toUpper();
  118. cpu_id = str0_1 + str1_1;
  119. return cpu_id;
  120. }
  121. QString Arab2Sinogram(int num)
  122. {
  123. QStringList lNum = { QString::fromLocal8Bit("零"),
  124. QString::fromLocal8Bit("一"),
  125. QString::fromLocal8Bit("二"),
  126. QString::fromLocal8Bit("三"),
  127. QString::fromLocal8Bit("四"),
  128. QString::fromLocal8Bit("五"),
  129. QString::fromLocal8Bit("六"),
  130. QString::fromLocal8Bit("七"),
  131. QString::fromLocal8Bit("八"),
  132. QString::fromLocal8Bit("九") };
  133. QStringList lBit = { "", QString::fromLocal8Bit("十"),
  134. QString::fromLocal8Bit("百"),
  135. QString::fromLocal8Bit("千") };
  136. QStringList lTep = { "",
  137. QString::fromLocal8Bit("万"),
  138. QString::fromLocal8Bit("亿"),
  139. QString::fromLocal8Bit("万"),
  140. QString::fromLocal8Bit("亿"),
  141. QString::fromLocal8Bit("万"),
  142. QString::fromLocal8Bit("亿") };
  143. std::vector<char> input;
  144. QString output;
  145. bool bZero = false;
  146. int n = (int)log10((float)num) + 1;
  147. for (int i = 0; i < n; i++, num = num / 10)
  148. {
  149. input.push_back((char)(num % 10));
  150. }
  151. for (int i = n - 1; i >= 0; i--)
  152. {
  153. num = input[i];
  154. if (num == 0)
  155. {
  156. bZero = true;
  157. }
  158. else if (num > 0 && bZero)
  159. {
  160. output += lNum[0];
  161. bZero = false;
  162. }
  163. if (num > 0)
  164. {
  165. output += lNum[num];
  166. output += lBit[(i) % 4];
  167. }
  168. if (i % 4 == 0)
  169. {
  170. output += lTep[i / 4];
  171. bZero = true;
  172. }
  173. }
  174. if (output.isEmpty())
  175. {
  176. output += lNum[0];
  177. }
  178. return output;
  179. }
  180. void createDir(QString sDir)
  181. {
  182. QFileInfo fileInfo = sDir;
  183. QDir dir;
  184. QString sExt = fileInfo.suffix();
  185. if(sExt.isEmpty())
  186. {
  187. dir = QDir(fileInfo.absoluteFilePath());
  188. }
  189. else
  190. {
  191. dir = QDir(fileInfo.absolutePath());
  192. }
  193. if(!dir.exists())
  194. {
  195. dir.mkpath(dir.absolutePath());
  196. }
  197. }
  198. QString getUuid()
  199. {
  200. QUuid id = QUuid::createUuid();
  201. QString strId = id.toString();
  202. strId.replace("-", "");
  203. strId = strId.mid(1, strId.length() - 2);
  204. return strId;
  205. }
  206. qint64 getTimeStamp()
  207. {
  208. QDateTime time = QDateTime::currentDateTime(); //获取当前时间
  209. uint timeStamp = time.toTime_t(); //将当前时间转为时间戳
  210. return timeStamp;
  211. }
  212. bool isUseRDP()//是否使用远程桌面
  213. {
  214. QProcess process;
  215. QString cmd = QString("qwinsta.exe");
  216. QStringList sparam;
  217. process.start(cmd, sparam);
  218. process.waitForFinished();
  219. QByteArray qbt = process.readAllStandardOutput();
  220. QString sInfo = QString::fromLocal8Bit(qbt.data());
  221. // myDebug()<<sInfo;
  222. if(sInfo.indexOf("rdp") < 0)
  223. {
  224. return false;
  225. }
  226. else
  227. {
  228. return true;
  229. }
  230. }
  231. QString GetPathByProcessID(DWORD pid)
  232. {
  233. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
  234. if (!hProcess)
  235. {
  236. //QMessageBox::warning(NULL,"GetPathByProcessID","无权访问该进程");
  237. return "";
  238. }
  239. WCHAR filePath[MAX_PATH];
  240. DWORD ret= GetModuleFileNameEx(hProcess, NULL, filePath, MAX_PATH) ;
  241. QString file = QString::fromStdWString( filePath );
  242. //QMessageBox::warning(NULL,"GetPathByProcessID ret=", QString::number(ret)+":"+file);
  243. CloseHandle(hProcess);
  244. return ret==0?"":file;
  245. }
  246. void getAllAppNameList(QStringList &appList, QStringList sCheckApps, QStringList sCheckNames)
  247. {
  248. PROCESSENTRY32 pe32;
  249. pe32.dwSize = sizeof(pe32);
  250. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  251. if(hProcessSnap == INVALID_HANDLE_VALUE)
  252. {
  253. return ;
  254. }
  255. BOOL bMore = Process32First(hProcessSnap,&pe32);
  256. while(bMore)
  257. {
  258. QString exeName = (QString::fromUtf16(reinterpret_cast<const unsigned short *>(pe32.szExeFile)));
  259. QString exePath = GetPathByProcessID( pe32.th32ProcessID );
  260. exePath = FORMAT_PATH( exePath );
  261. if(!exePath.isEmpty() )
  262. {
  263. for(int i = 0; i < sCheckApps.count(); ++i)
  264. {
  265. if(exeName.toLower().indexOf(sCheckApps[i].toLower()) == 0)
  266. {
  267. if(appList.indexOf(sCheckNames[i]) < 0)
  268. {
  269. appList.push_back(sCheckNames[i]);
  270. }
  271. }
  272. }
  273. }
  274. bMore = Process32Next(hProcessSnap,&pe32);
  275. }
  276. CloseHandle(hProcessSnap);
  277. }
  278. int listCameraDevices(std::vector<CameraInfo> &list)
  279. {
  280. int deviceCounter = 0;
  281. HRESULT hr = CoInitialize(NULL);
  282. if (SUCCEEDED(hr))
  283. {
  284. IEnumMoniker *pEnum;
  285. ICreateDevEnum *pDevEnum;
  286. HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
  287. CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
  288. if (SUCCEEDED(hr))
  289. {
  290. // Create an enumerator for the category.
  291. hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);
  292. if (hr == S_FALSE)
  293. {
  294. hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error.
  295. }
  296. pDevEnum->Release();
  297. }
  298. if (SUCCEEDED(hr))
  299. {
  300. IMoniker *pMoniker = NULL;
  301. while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
  302. {
  303. IPropertyBag *pPropBag;
  304. HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
  305. if (FAILED(hr))
  306. {
  307. pMoniker->Release();
  308. continue;
  309. }
  310. CameraInfo cam;
  311. VARIANT var;
  312. VariantInit(&var);
  313. // Get description or friendly name.
  314. hr = pPropBag->Read(L"Description", &var, 0);
  315. if (FAILED(hr))
  316. {
  317. hr = pPropBag->Read(L"FriendlyName", &var, 0);
  318. }
  319. if (SUCCEEDED(hr))
  320. {
  321. cam.name = var.bstrVal;
  322. VariantClear(&var);
  323. }
  324. hr = pPropBag->Read(L"DevicePath", &var, 0);
  325. if (SUCCEEDED(hr))
  326. {
  327. std::wstring strInfo = var.bstrVal;
  328. std::wstring subStr = L"";
  329. std::wstring strVid = L"";
  330. std::wstring strPid = L"";
  331. cam.detail = strInfo;
  332. myDebug()<<strInfo;
  333. //硬件厂商id Ven 或者vid int
  334. size_t nPos = strInfo.find(L"vid_", 0);
  335. if(nPos != std::wstring::npos)
  336. {
  337. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  338. size_t nSubPos = subStr.find(L"&", 0);
  339. strVid = subStr.substr(0, nSubPos);
  340. cam.vid = strVid;
  341. }
  342. else
  343. {
  344. size_t nPos = strInfo.find(L"ven_", 0);
  345. if(nPos != std::wstring::npos)
  346. {
  347. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  348. size_t nSubPos = subStr.find(L"&", 0);
  349. strVid = subStr.substr(0, nSubPos);
  350. cam.vid = strVid;
  351. }
  352. else
  353. {
  354. size_t nPos = strInfo.find(L"int", 0);
  355. if(nPos != std::wstring::npos)
  356. {
  357. subStr = strInfo.substr(nPos+3,strInfo.length() - nPos-3);
  358. size_t nSubPos = subStr.find(L"#", 0);
  359. strVid = subStr.substr(0, nSubPos);
  360. cam.vid = strVid;
  361. }
  362. }
  363. }
  364. //代表产品编号DEV pid uid
  365. nPos = strInfo.find(L"pid_", 0);
  366. subStr = L"";
  367. if(nPos != std::wstring::npos)
  368. {
  369. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  370. size_t nSubPos = subStr.find(L"&", 0);
  371. strPid = subStr.substr(0, nSubPos);
  372. cam.pid = strPid;
  373. }
  374. else
  375. {
  376. nPos = strInfo.find(L"dev_", 0);
  377. subStr = L"";
  378. if(nPos != std::wstring::npos)
  379. {
  380. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  381. size_t nSubPos = subStr.find(L"&", 0);
  382. strPid = subStr.substr(0, nSubPos);
  383. cam.pid = strPid;
  384. }
  385. else
  386. {
  387. nPos = strInfo.find(L"uid", 0);
  388. subStr = L"";
  389. if(nPos != std::wstring::npos)
  390. {
  391. subStr = strInfo.substr(nPos+3,strInfo.length() - nPos-3);
  392. size_t nSubPos = subStr.find(L"#", 0);
  393. strPid = subStr.substr(0, nSubPos);
  394. cam.pid = strPid;
  395. }
  396. }
  397. }
  398. VariantClear(&var);
  399. }
  400. pPropBag->Release();
  401. pMoniker->Release();
  402. list.push_back(cam);
  403. ++deviceCounter;
  404. }
  405. pEnum->Release();
  406. }
  407. CoUninitialize();
  408. }
  409. return deviceCounter;
  410. }
  411. int listCameraDevices(std::vector<CameraInfo> &list, QStringList &CameraList, QStringList checkCameraLiist)
  412. {
  413. int deviceCounter = 0;
  414. HRESULT hr = CoInitialize(NULL);
  415. if (SUCCEEDED(hr))
  416. {
  417. IEnumMoniker *pEnum;
  418. ICreateDevEnum *pDevEnum;
  419. HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
  420. CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
  421. if (SUCCEEDED(hr))
  422. {
  423. // Create an enumerator for the category.
  424. hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);
  425. if (hr == S_FALSE)
  426. {
  427. hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error.
  428. }
  429. pDevEnum->Release();
  430. }
  431. if (SUCCEEDED(hr))
  432. {
  433. IMoniker *pMoniker = NULL;
  434. while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
  435. {
  436. IPropertyBag *pPropBag;
  437. HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
  438. if (FAILED(hr))
  439. {
  440. pMoniker->Release();
  441. continue;
  442. }
  443. CameraInfo cam;
  444. VARIANT var;
  445. VariantInit(&var);
  446. // Get description or friendly name.
  447. hr = pPropBag->Read(L"Description", &var, 0);
  448. if (FAILED(hr))
  449. {
  450. hr = pPropBag->Read(L"FriendlyName", &var, 0);
  451. }
  452. if (SUCCEEDED(hr))
  453. {
  454. cam.name = var.bstrVal;
  455. QString sCameraName = QString::fromStdWString(cam.name);
  456. for(int i = 0; i < checkCameraLiist.count(); ++i)
  457. {
  458. if(sCameraName.toLower().indexOf(checkCameraLiist[i].toLower()) == 0)
  459. {
  460. if(CameraList.indexOf(sCameraName) < 0)
  461. {
  462. CameraList.push_back(sCameraName);
  463. }
  464. }
  465. }
  466. VariantClear(&var);
  467. }
  468. hr = pPropBag->Read(L"DevicePath", &var, 0);
  469. if (SUCCEEDED(hr))
  470. {
  471. std::wstring strInfo = var.bstrVal;
  472. std::wstring subStr = L"";
  473. std::wstring strVid = L"";
  474. std::wstring strPid = L"";
  475. cam.detail = strInfo;
  476. myDebug()<<strInfo;
  477. //硬件厂商id Ven 或者vid int
  478. size_t nPos = strInfo.find(L"vid_", 0);
  479. if(nPos != std::wstring::npos)
  480. {
  481. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  482. size_t nSubPos = subStr.find(L"&", 0);
  483. strVid = subStr.substr(0, nSubPos);
  484. cam.vid = strVid;
  485. }
  486. else
  487. {
  488. size_t nPos = strInfo.find(L"ven_", 0);
  489. if(nPos != std::wstring::npos)
  490. {
  491. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  492. size_t nSubPos = subStr.find(L"&", 0);
  493. strVid = subStr.substr(0, nSubPos);
  494. cam.vid = strVid;
  495. }
  496. else
  497. {
  498. size_t nPos = strInfo.find(L"int", 0);
  499. if(nPos != std::wstring::npos)
  500. {
  501. subStr = strInfo.substr(nPos+3,strInfo.length() - nPos-3);
  502. size_t nSubPos = subStr.find(L"#", 0);
  503. strVid = subStr.substr(0, nSubPos);
  504. cam.vid = strVid;
  505. }
  506. }
  507. }
  508. //代表产品编号DEV pid uid
  509. nPos = strInfo.find(L"pid_", 0);
  510. subStr = L"";
  511. if(nPos != std::wstring::npos)
  512. {
  513. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  514. size_t nSubPos = subStr.find(L"&", 0);
  515. strPid = subStr.substr(0, nSubPos);
  516. cam.pid = strPid;
  517. }
  518. else
  519. {
  520. nPos = strInfo.find(L"dev_", 0);
  521. subStr = L"";
  522. if(nPos != std::wstring::npos)
  523. {
  524. subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  525. size_t nSubPos = subStr.find(L"&", 0);
  526. strPid = subStr.substr(0, nSubPos);
  527. cam.pid = strPid;
  528. }
  529. else
  530. {
  531. nPos = strInfo.find(L"uid", 0);
  532. subStr = L"";
  533. if(nPos != std::wstring::npos)
  534. {
  535. subStr = strInfo.substr(nPos+3,strInfo.length() - nPos-3);
  536. size_t nSubPos = subStr.find(L"#", 0);
  537. strPid = subStr.substr(0, nSubPos);
  538. cam.pid = strPid;
  539. }
  540. }
  541. }
  542. VariantClear(&var);
  543. }
  544. pPropBag->Release();
  545. pMoniker->Release();
  546. list.push_back(cam);
  547. ++deviceCounter;
  548. }
  549. pEnum->Release();
  550. }
  551. CoUninitialize();
  552. }
  553. return deviceCounter;
  554. // ICreateDevEnum *pDevEnum = NULL;
  555. // IEnumMoniker *pEnum = NULL;
  556. // int deviceCounter = 0;
  557. // CoInitialize(NULL);
  558. // HRESULT hr = CoCreateInstance(
  559. // CLSID_SystemDeviceEnum,
  560. // NULL,
  561. // CLSCTX_INPROC_SERVER,
  562. // IID_ICreateDevEnum,
  563. // reinterpret_cast<void**>(&pDevEnum)
  564. // );
  565. // if (SUCCEEDED(hr))
  566. // {
  567. // hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);
  568. // if (hr == S_OK)
  569. // {
  570. // // int nIdx = 0;
  571. // IMoniker *pMoniker = NULL;
  572. // while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
  573. // {
  574. // IPropertyBag *pPropBag;
  575. // hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
  576. // (void**)(&pPropBag));
  577. // if (FAILED(hr)) {
  578. // pMoniker->Release();
  579. // continue; // Skip this one, maybe the next one will work.
  580. // }
  581. // VARIANT var;
  582. // VariantInit(&var);
  583. // hr = pPropBag->Read(L"Description", &var, 0);
  584. // if (FAILED(hr))
  585. // {
  586. // hr = pPropBag->Read(L"FriendlyName", &var, 0);
  587. // }
  588. // CameraInfo cam;
  589. // LPOLESTR pwszName;
  590. // pMoniker->GetDisplayName(0,NULL,&pwszName);
  591. // std::wstring strInfo = pwszName;
  592. // std::wstring subStr = L"";
  593. // std::wstring strVid = L"";
  594. // std::wstring strPid = L"";
  595. // cam.detail = strInfo;
  596. // myDebug()<<strInfo;
  597. // //硬件厂商id Ven 或者vid int
  598. // size_t nPos = strInfo.find(L"vid_", 0);
  599. // if(nPos != std::wstring::npos)
  600. // {
  601. // subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  602. // size_t nSubPos = subStr.find(L"&", 0);
  603. // strVid = subStr.substr(0, nSubPos);
  604. // cam.vid = strVid;
  605. // }
  606. // else
  607. // {
  608. // size_t nPos = strInfo.find(L"ven_", 0);
  609. // if(nPos != std::wstring::npos)
  610. // {
  611. // subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  612. // size_t nSubPos = subStr.find(L"&", 0);
  613. // strVid = subStr.substr(0, nSubPos);
  614. // cam.vid = strVid;
  615. // }
  616. // else
  617. // {
  618. // size_t nPos = strInfo.find(L"int", 0);
  619. // if(nPos != std::wstring::npos)
  620. // {
  621. // subStr = strInfo.substr(nPos+3,strInfo.length() - nPos-3);
  622. // size_t nSubPos = subStr.find(L"#", 0);
  623. // strVid = subStr.substr(0, nSubPos);
  624. // cam.vid = strVid;
  625. // }
  626. // }
  627. // }
  628. // //代表产品编号DEV pid uid
  629. // nPos = strInfo.find(L"pid_", 0);
  630. // subStr = L"";
  631. // if(nPos != std::wstring::npos)
  632. // {
  633. // subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  634. // size_t nSubPos = subStr.find(L"&", 0);
  635. // strPid = subStr.substr(0, nSubPos);
  636. // cam.pid = strPid;
  637. // }
  638. // else
  639. // {
  640. // nPos = strInfo.find(L"dev_", 0);
  641. // subStr = L"";
  642. // if(nPos != std::wstring::npos)
  643. // {
  644. // subStr = strInfo.substr(nPos+4,strInfo.length() - nPos-4);
  645. // size_t nSubPos = subStr.find(L"&", 0);
  646. // strPid = subStr.substr(0, nSubPos);
  647. // cam.pid = strPid;
  648. // }
  649. // else
  650. // {
  651. // nPos = strInfo.find(L"uid", 0);
  652. // subStr = L"";
  653. // if(nPos != std::wstring::npos)
  654. // {
  655. // subStr = strInfo.substr(nPos+3,strInfo.length() - nPos-3);
  656. // size_t nSubPos = subStr.find(L"#", 0);
  657. // strPid = subStr.substr(0, nSubPos);
  658. // cam.pid = strPid;
  659. // }
  660. // }
  661. // }
  662. // VARIANT varName;
  663. // VariantInit(&varName);
  664. // hr = pPropBag->Read(L"Description", &varName, 0);
  665. // if (FAILED(hr))
  666. // {
  667. // hr = pPropBag->Read(L"FriendlyName", &varName, 0);
  668. // }
  669. // if (SUCCEEDED(hr))
  670. // {
  671. // hr = pPropBag->Read(L"FriendlyName", &varName, 0);
  672. // int count = 0;
  673. // wchar_t wtmp[255] = { 0 };
  674. // char tmp[255] = { 0 };
  675. // memset(tmp, 0, 255);
  676. // while (varName.bstrVal[count] != 0x00 && count < 255)
  677. // {
  678. // wtmp[count] = (wchar_t)varName.bstrVal[count];
  679. // count++;
  680. // }
  681. // cam.name = wtmp;
  682. // list.push_back(cam);
  683. // }
  684. // pPropBag->Release();
  685. // pPropBag = NULL;
  686. // pMoniker->Release();
  687. // pMoniker = NULL;
  688. // deviceCounter++;
  689. // }
  690. // pDevEnum->Release();
  691. // pDevEnum = NULL;
  692. // pEnum->Release();
  693. // pEnum = NULL;
  694. // }
  695. // }
  696. // CoUninitialize();
  697. // return deviceCounter;
  698. }
  699. QString fileMd5(QString sFileName)//获取文件MD5值
  700. {
  701. QFile theFile(sFileName);
  702. if(!theFile.open(QIODevice::ReadOnly))
  703. {
  704. return "";
  705. }
  706. QByteArray ba = QCryptographicHash::hash(theFile.readAll(), QCryptographicHash::Md5);
  707. theFile.close();
  708. return ba.toHex().constData();
  709. }
  710. void topMostSlot(QWidget *widget, bool bTopMost)
  711. {
  712. if(bTopMost)
  713. {
  714. Qt::WindowFlags m_flags = widget->windowFlags();
  715. widget->setWindowFlags(m_flags | Qt::WindowStaysOnTopHint);
  716. widget->show();
  717. }
  718. else
  719. {
  720. Qt::WindowFlags m_flags = Qt::FramelessWindowHint;
  721. widget->setWindowFlags(m_flags);
  722. widget->show();
  723. }
  724. }
  725. QImage Mat2QImage(const cv::Mat& mat)
  726. {
  727. try
  728. {
  729. //8-bitsunsigned,NO.OFCHANNELS=1
  730. if(mat.type()==CV_8UC1)
  731. {
  732. QVector<QRgb>colorTable;
  733. for(int i=0;i<256;i++)
  734. {
  735. colorTable.push_back(qRgb(i,i,i));
  736. }
  737. const uchar*qImageBuffer=(const uchar*)mat.data;
  738. QImage img(qImageBuffer,mat.cols,mat.rows,mat.step,QImage::Format_Indexed8);
  739. img.setColorTable(colorTable);
  740. return img;
  741. }
  742. //8-bitsunsigned,NO.OFCHANNELS=3
  743. if(mat.type()==CV_8UC3)
  744. {
  745. //CopyinputMat
  746. const uchar* qImageBuffer = (const uchar*)mat.data;
  747. QImage img(qImageBuffer,mat.cols,mat.rows,mat.step,QImage::Format_RGB888);
  748. return img.rgbSwapped();
  749. }
  750. else if(mat.type()==CV_8UC4)
  751. {
  752. const uchar* qImageBuffer = (const uchar*)mat.data;
  753. QImage img(qImageBuffer,mat.cols,mat.rows,mat.step,QImage::Format_RGBA8888);
  754. return img.rgbSwapped();
  755. }
  756. else
  757. {
  758. myServerLog()<<"Mat to Image error";
  759. return QImage();
  760. }
  761. }
  762. catch(std::exception &e)
  763. {
  764. myServerLog()<<"Mat2QImage"<<e.what();
  765. return QImage();
  766. }
  767. }
  768. bool checkMat(cv::Mat& mat)
  769. {
  770. for (int i = 0; i < mat.rows; i++)
  771. {
  772. uchar* pRow = (unsigned char*)mat.ptr<uchar>(i);
  773. for (int j = 0; j < mat.cols * mat.channels(); j++)
  774. {
  775. #ifdef _DEBUG
  776. if (pRow[j] != 0xcd)
  777. #else
  778. if (pRow[j])
  779. #endif
  780. {
  781. return true;
  782. }
  783. }
  784. }
  785. return false;
  786. }
  787. void genRandomNumber(QList<int> &listRandom, int nSize)
  788. {
  789. for(int i = 1; i <= nSize; i++)
  790. {
  791. listRandom.push_back(i);
  792. }
  793. std::random_device rd;
  794. std::mt19937 g(rd());
  795. std::shuffle(listRandom.begin(), listRandom.end(), g);
  796. }
  797. int genRandomNumber(int nForm, int nTo)
  798. {
  799. std::random_device rand_dev;
  800. std::mt19937 generator(rand_dev());
  801. std::uniform_int_distribution<int> distr(nForm, nTo);
  802. return distr(generator);
  803. }
  804. QString getImageRawBase64Str(QString sBase64Image)
  805. {
  806. int nIndex = sBase64Image.indexOf("base64,");
  807. if(nIndex >= 0)
  808. {
  809. return sBase64Image.right(sBase64Image.length() - nIndex - 7);
  810. }
  811. return sBase64Image;
  812. }
  813. }