oshelper.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:12k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // VirtualDub - Video processing and capture application
  2. // Copyright (C) 1998-2001 Avery Lee
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #include "VirtualDub.h"
  18. #include <stdlib.h>
  19. #include <windows.h>
  20. #include <shellapi.h>
  21. #include "oshelper.h"
  22. void Draw3DRect(HDC hDC, LONG x, LONG y, LONG dx, LONG dy, BOOL inverted) {
  23. HPEN hPenOld;
  24. hPenOld = (HPEN)SelectObject(hDC, GetStockObject(inverted ? WHITE_PEN : BLACK_PEN));
  25. MoveToEx(hDC, x, y+dy-1, NULL);
  26. LineTo(hDC, x+dx-1, y+dy-1);
  27. LineTo(hDC, x+dx-1, y);
  28. DeleteObject(SelectObject(hDC, GetStockObject(inverted ? BLACK_PEN : WHITE_PEN)));
  29. MoveToEx(hDC, x, y+dy-1, NULL);
  30. LineTo(hDC, x, y);
  31. LineTo(hDC, x+dx-1, y);
  32. DeleteObject(SelectObject(hDC, hPenOld));
  33. }
  34. // We follow MAME32's lead and put our keys in:
  35. //
  36. // HKEY_CURRENT_USERSoftwareFreewareVirtualDub
  37. HKEY OpenConfigKey(const char *szKeyName) {
  38. char temp[MAX_PATH]="Software\Freeware\VirtualDub";
  39. HKEY hkey;
  40. if (szKeyName) {
  41. strcat(temp, "\");
  42. strcat(temp, szKeyName);
  43. }
  44. return RegOpenKeyEx(HKEY_CURRENT_USER, temp, 0, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS
  45. ? hkey
  46. : NULL;
  47. }
  48. HKEY CreateConfigKey(const char *szKeyName) {
  49. char temp[MAX_PATH]="Software\Freeware\VirtualDub";
  50. HKEY hkey;
  51. DWORD dwDisposition;
  52. if (szKeyName) {
  53. strcat(temp, "\");
  54. strcat(temp, szKeyName);
  55. }
  56. return RegCreateKeyEx(HKEY_CURRENT_USER, temp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition)==ERROR_SUCCESS
  57. ? hkey
  58. : NULL;
  59. }
  60. BOOL DeleteConfigValue(const char *szKeyName, const char *szValueName) {
  61. HKEY hkey;
  62. BOOL success;
  63. if (!(hkey = OpenConfigKey(szKeyName)))
  64. return FALSE;
  65. success = (RegDeleteValue(hkey, szValueName) == ERROR_SUCCESS);
  66. RegCloseKey(hkey);
  67. return success;
  68. }
  69. BOOL QueryConfigString(const char *szKeyName, const char *szValueName, char *lpBuffer, int cbBuffer) {
  70. HKEY hkey;
  71. BOOL success;
  72. DWORD type;
  73. if (!(hkey = OpenConfigKey(szKeyName)))
  74. return FALSE;
  75. success = (ERROR_SUCCESS == RegQueryValueEx(hkey, szValueName, 0, &type, (LPBYTE)lpBuffer, (LPDWORD)&cbBuffer));
  76. RegCloseKey(hkey);
  77. return success;
  78. }
  79. DWORD QueryConfigBinary(const char *szKeyName, const char *szValueName, char *lpBuffer, int cbBuffer) {
  80. HKEY hkey;
  81. BOOL success;
  82. DWORD type;
  83. DWORD size = cbBuffer;
  84. if (!(hkey = OpenConfigKey(szKeyName)))
  85. return 0;
  86. success = (ERROR_SUCCESS == RegQueryValueEx(hkey, szValueName, 0, &type, (LPBYTE)lpBuffer, (LPDWORD)&size));
  87. RegCloseKey(hkey);
  88. return success ? size : 0;
  89. }
  90. BOOL QueryConfigDword(const char *szKeyName, const char *szValueName, DWORD *lpdwData) {
  91. HKEY hkey;
  92. BOOL success;
  93. DWORD type;
  94. DWORD size = sizeof(DWORD);
  95. if (!(hkey = OpenConfigKey(szKeyName)))
  96. return 0;
  97. success = (ERROR_SUCCESS == RegQueryValueEx(hkey, szValueName, 0, &type, (LPBYTE)lpdwData, (LPDWORD)&size));
  98. RegCloseKey(hkey);
  99. return success;
  100. }
  101. BOOL SetConfigString(const char *szKeyName, const char *szValueName, const char *lpBuffer) {
  102. HKEY hkey;
  103. BOOL success;
  104. if (!(hkey = CreateConfigKey(szKeyName)))
  105. return FALSE;
  106. success = (ERROR_SUCCESS == RegSetValueEx(hkey, szValueName, 0, REG_SZ, (LPBYTE)lpBuffer, strlen(lpBuffer)+1));
  107. RegCloseKey(hkey);
  108. return success;
  109. }
  110. BOOL SetConfigBinary(const char *szKeyName, const char *szValueName, const char *lpBuffer, int cbBuffer) {
  111. HKEY hkey;
  112. BOOL success;
  113. if (!(hkey = CreateConfigKey(szKeyName)))
  114. return FALSE;
  115. success = (ERROR_SUCCESS == RegSetValueEx(hkey, szValueName, 0, REG_BINARY, (LPBYTE)lpBuffer, cbBuffer));
  116. RegCloseKey(hkey);
  117. return success;
  118. }
  119. BOOL SetConfigDword(const char *szKeyName, const char *szValueName, DWORD dwData) {
  120. HKEY hkey;
  121. BOOL success;
  122. if (!(hkey = CreateConfigKey(szKeyName)))
  123. return FALSE;
  124. success = (ERROR_SUCCESS == RegSetValueEx(hkey, szValueName, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)));
  125. RegCloseKey(hkey);
  126. return success;
  127. }
  128. ///////////////////////////////////////////////////////////////////////////
  129. //
  130. // help support
  131. //
  132. ///////////////////////////////////////////////////////////////////////////
  133. static char g_szHelpPath[MAX_PATH]="VirtualD.hlp";
  134. void HelpSetPath() {
  135. char szPath[MAX_PATH];
  136. char *lpFilePart;
  137. char *ext = NULL;
  138. if (GetModuleFileName(NULL, szPath, sizeof szPath))
  139. if (GetFullPathName(szPath, sizeof g_szHelpPath, g_szHelpPath, &lpFilePart))
  140. strcpy(lpFilePart,"VirtualD.hlp");
  141. }
  142. const char *HelpGetPath() {
  143. return g_szHelpPath;
  144. }
  145. void HelpShowHelp(HWND hwnd) {
  146. WinHelp(hwnd, g_szHelpPath, HELP_FINDER, 0);
  147. }
  148. void HelpContext(HWND hwnd, DWORD helpID) {
  149. WinHelp(hwnd, g_szHelpPath, HELP_CONTEXT, helpID);
  150. }
  151. void HelpPopup(HWND hwnd, DWORD helpID) {
  152. WinHelp(hwnd, g_szHelpPath, HELP_CONTEXTPOPUP, helpID);
  153. }
  154. void HelpPopupByID(HWND hwnd, DWORD ctrlID, const DWORD *lookup) {
  155. while(lookup[0]) {
  156. if (lookup[0] == ctrlID)
  157. HelpPopup(hwnd, lookup[1]);
  158. lookup+=2;
  159. }
  160. }
  161. ///////////////////////////////////////////////////////////////////////////
  162. //
  163. // disk free space
  164. //
  165. ///////////////////////////////////////////////////////////////////////////
  166. static HINSTANCE g_hInstKernel32 = NULL;
  167. static BOOL (__stdcall *g_fpGetDiskFreeSpaceEx)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = NULL;
  168. static bool g_triedGetDiskFreeSpaceEx = false;
  169. __int64 MyGetDiskFreeSpace(const char *lpszRoot) {
  170. __int64 client_free, total_space, free_space;
  171. DWORD dwSectorsPerCluster, dwBytesPerSector, dwFreeClusters, dwTotalClusters;
  172. char tmp[MAX_PATH];
  173. if (!g_hInstKernel32 && !(g_hInstKernel32 = LoadLibrary("kernel32.dll")))
  174. return -1;
  175. if (!g_triedGetDiskFreeSpaceEx) {
  176. g_fpGetDiskFreeSpaceEx = (BOOL (__stdcall *)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER))GetProcAddress(g_hInstKernel32, "GetDiskFreeSpaceExA");
  177. g_triedGetDiskFreeSpaceEx = true;
  178. }
  179. lpszRoot = SplitPathRoot(tmp, lpszRoot);
  180. if (g_fpGetDiskFreeSpaceEx) {
  181. return g_fpGetDiskFreeSpaceEx(lpszRoot, (PULARGE_INTEGER)&client_free, (PULARGE_INTEGER)&total_space, (PULARGE_INTEGER)&free_space)
  182. ? free_space
  183. : -1;
  184. } else {
  185. return GetDiskFreeSpace(lpszRoot, &dwSectorsPerCluster, &dwBytesPerSector, &dwFreeClusters, &dwTotalClusters)
  186. ? dwFreeClusters * dwSectorsPerCluster * dwBytesPerSector
  187. : -1;
  188. }
  189. }
  190. const char *SplitPathName(const char *path) {
  191. const char *s = path;
  192. while(*s) ++s;
  193. while(s>path && s[-1]!='\' && s[-1]!=':')
  194. --s;
  195. return s;
  196. }
  197. const char *SplitPathExt(const char *path) {
  198. const char *s = path;
  199. const char *tail;
  200. while(*s) ++s;
  201. tail = s;
  202. while(s>path && s[-1]!='\' && s[-1]!=':') {
  203. if (s[-1]=='.')
  204. return s-1;
  205. --s;
  206. }
  207. return tail;
  208. }
  209. char *MergePath(char *path, const char *fn) {
  210. char *slash=NULL, *colon=NULL;
  211. char *s = path;
  212. if (!*s) {
  213. strcpy(path, fn);
  214. return path;
  215. }
  216. while(*s)
  217. ++s;
  218. if (s[-1]!='\' && s[-1]!=':')
  219. *s++ = '\';
  220. strcpy(s, fn);
  221. return path;
  222. }
  223. char *SplitPathRoot(char *dst, const char *path) {
  224. if (!path)
  225. return NULL;
  226. // C:
  227. if (isalpha(path[0]) && path[1]==':') {
  228. dst[0] = path[0];
  229. dst[1] = ':';
  230. dst[2] = '\';
  231. dst[3] = 0;
  232. return dst;
  233. }
  234. // UNC path?
  235. if (path[0] == '\' && path[1] == '\') {
  236. const char *s = path+2;
  237. char *t = dst;
  238. *t++ = '\';
  239. *t++ = '\';
  240. while(*s && *s != '\')
  241. *t++ = *s++;
  242. if (*s)
  243. *t++ = *s++;
  244. while(*s && *s != '\')
  245. *t++ = *s++;
  246. *t++ = '\';
  247. *t = 0;
  248. return dst;
  249. }
  250. return NULL;
  251. }
  252. bool IsFilenameOnFATVolume(const char *pszFilename) {
  253. char szFileRoot[MAX_PATH];
  254. DWORD dwMaxComponentLength;
  255. DWORD dwFSFlags;
  256. char szFilesystem[MAX_PATH];
  257. if (!GetVolumeInformation(SplitPathRoot(szFileRoot, pszFilename),
  258. NULL, 0, // Volume name buffer
  259. NULL, // Serial number buffer
  260. &dwMaxComponentLength,
  261. &dwFSFlags,
  262. szFilesystem,
  263. sizeof szFilesystem))
  264. return false;
  265. return !strnicmp(szFilesystem, "FAT", 3);
  266. }
  267. ///////////////////////////////////////////////////////////////////////////
  268. void LaunchURL(const char *pURL) {
  269. ShellExecute(NULL, "open", pURL, NULL, NULL, SW_SHOWNORMAL);
  270. }
  271. ///////////////////////////////////////////////////////////////////////////
  272. bool EnableCPUTracking() {
  273. HKEY hOpen;
  274. DWORD cbData;
  275. DWORD dwType;
  276. LPBYTE pByte;
  277. DWORD rc;
  278. bool fSuccess = true;
  279.     if ( (rc = RegOpenKeyEx(HKEY_DYN_DATA,"PerfStats\StartStat", 0,
  280. KEY_READ, &hOpen)) == ERROR_SUCCESS) {
  281. // query to get data size
  282. if ( (rc = RegQueryValueEx(hOpen,"KERNEL\CPUUsage",NULL,&dwType,
  283. NULL, &cbData )) == ERROR_SUCCESS) {
  284. pByte = (LPBYTE)allocmem(cbData);
  285. rc = RegQueryValueEx(hOpen,"KERNEL\CPUUsage",NULL,&dwType, pByte,
  286.                               &cbData );
  287. freemem(pByte);
  288. } else
  289. fSuccess = false;
  290. RegCloseKey(hOpen);
  291. } else
  292. fSuccess = false;
  293. return fSuccess;
  294. }
  295. bool DisableCPUTracking() {
  296. HKEY hOpen;
  297. DWORD cbData;
  298. DWORD dwType;
  299. LPBYTE pByte;
  300. DWORD rc;
  301. bool fSuccess = true;
  302.     if ( (rc = RegOpenKeyEx(HKEY_DYN_DATA,"PerfStats\StopStat", 0,
  303. KEY_READ, &hOpen)) == ERROR_SUCCESS) {
  304. // query to get data size
  305. if ( (rc = RegQueryValueEx(hOpen,"KERNEL\CPUUsage",NULL,&dwType,
  306. NULL, &cbData )) == ERROR_SUCCESS) {
  307. pByte = (LPBYTE)allocmem(cbData);
  308. rc = RegQueryValueEx(hOpen,"KERNEL\CPUUsage",NULL,&dwType, pByte,
  309.                               &cbData );
  310. freemem(pByte);
  311. } else
  312. fSuccess = false;
  313. RegCloseKey(hOpen);
  314. } else
  315. fSuccess = false;
  316. return fSuccess;
  317. }
  318. CPUUsageReader::CPUUsageReader() {
  319. FILETIME ftCreate, ftExit;
  320. hkeyKernelCPU = NULL;
  321. fNTMethod = false;
  322. if (GetProcessTimes(GetCurrentProcess(), &ftCreate, &ftExit, (FILETIME *)&kt_last, (FILETIME *)&ut_last)) {
  323. // Using Windows NT/2000 method
  324. GetSystemTimeAsFileTime((FILETIME *)&st_last);
  325. fNTMethod = true;
  326. } else {
  327. // Using Windows 95/98 method
  328. HKEY hkey;
  329. if (EnableCPUTracking()) {
  330. if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_DYN_DATA, "PerfStats\StatData", 0, KEY_READ, &hkey)) {
  331. hkeyKernelCPU = hkey;
  332. } else
  333. DisableCPUTracking();
  334. }
  335. }
  336. }
  337. CPUUsageReader::~CPUUsageReader() {
  338. if (hkeyKernelCPU) {
  339. RegCloseKey(hkeyKernelCPU);
  340. DisableCPUTracking();
  341. }
  342. }
  343. int CPUUsageReader::read() {
  344. if (hkeyKernelCPU) {
  345. DWORD type;
  346. DWORD dwUsage;
  347. DWORD size = sizeof dwUsage;
  348. if (ERROR_SUCCESS == RegQueryValueEx(hkeyKernelCPU, "KERNEL\CPUUsage", 0, &type, (LPBYTE)&dwUsage, (LPDWORD)&size))
  349. return (int)dwUsage;
  350. return -1;
  351. } else if (fNTMethod) {
  352. FILETIME ftCreate, ftExit;
  353. unsigned __int64 kt, st, ut;
  354. int cpu;
  355. GetProcessTimes(GetCurrentProcess(), &ftCreate, &ftExit, (FILETIME *)&kt, (FILETIME *)&ut);
  356. GetSystemTimeAsFileTime((FILETIME *)&st);
  357. if (st == st_last)
  358. return 100;
  359. else
  360. cpu = (int)((100 * (kt + ut - kt_last - ut_last) + (st - st_last)/2) / (st - st_last));
  361. kt_last = kt;
  362. ut_last = ut;
  363. st_last = st;
  364. return cpu;
  365. }
  366. return -1;
  367. }