dxutil.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:19k
源码类别:

游戏

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: DXUtil.cpp
  3. //
  4. // Desc: Shortcut macros and functions for using DX objects
  5. //
  6. //
  7. // Copyright (c) 1997-2000 Microsoft Corporation. All rights reserved
  8. //-----------------------------------------------------------------------------
  9. #define STRICT
  10. #include <windows.h>
  11. #include <mmsystem.h>
  12. #include <tchar.h>
  13. #include <stdio.h> 
  14. #include <stdarg.h>
  15. #include "DXUtil.h"
  16. //-----------------------------------------------------------------------------
  17. // Name: DXUtil_GetDXSDKMediaPath()
  18. // Desc: Returns the DirectX SDK media path
  19. //-----------------------------------------------------------------------------
  20. const TCHAR* DXUtil_GetDXSDKMediaPath()
  21. {
  22.     static TCHAR strNull[2] = _T("");
  23.     static TCHAR strPath[MAX_PATH];
  24.     DWORD dwType;
  25.     DWORD dwSize = MAX_PATH;
  26.     HKEY  hKey;
  27.     // Open the appropriate registry key
  28.     LONG lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
  29.                                 _T("Software\Microsoft\DirectX"),
  30.                                 0, KEY_READ, &hKey );
  31.     if( ERROR_SUCCESS != lResult )
  32.         return strNull;
  33.     lResult = RegQueryValueEx( hKey, _T("DX8SDK Samples Path"), NULL,
  34.                               &dwType, (BYTE*)strPath, &dwSize );
  35.     RegCloseKey( hKey );
  36.     if( ERROR_SUCCESS != lResult )
  37.         return strNull;
  38.     _tcscat( strPath, _T("\Media\") );
  39.     return strPath;
  40. }
  41. //-----------------------------------------------------------------------------
  42. // Name: DXUtil_FindMediaFile()
  43. // Desc: Returns a valid path to a DXSDK media file
  44. //-----------------------------------------------------------------------------
  45. HRESULT DXUtil_FindMediaFile( TCHAR* strPath, TCHAR* strFilename )
  46. {
  47.     HANDLE file;
  48.     if( NULL==strFilename || NULL==strPath )
  49.         return E_INVALIDARG;
  50.     // Check if the file exists in the current directory
  51.     _tcscpy( strPath, strFilename );
  52.     file = CreateFile( strPath, GENERIC_READ, FILE_SHARE_READ, NULL, 
  53.                        OPEN_EXISTING, 0, NULL );
  54.     if( INVALID_HANDLE_VALUE != file )
  55.     {
  56.         CloseHandle( file );
  57.         return S_OK;
  58.     }
  59.     
  60.     // Check if the file exists in the current directory
  61.     _stprintf( strPath, _T("%s%s"), DXUtil_GetDXSDKMediaPath(), strFilename );
  62.     file = CreateFile( strPath, GENERIC_READ, FILE_SHARE_READ, NULL, 
  63.                        OPEN_EXISTING, 0, NULL );
  64.     if( INVALID_HANDLE_VALUE != file )
  65.     {
  66.         CloseHandle( file );
  67.         return S_OK;
  68.     }
  69.     // On failure, just return the file as the path
  70.     _tcscpy( strPath, strFilename );
  71.     return E_FAIL;
  72. }
  73. //-----------------------------------------------------------------------------
  74. // Name: DXUtil_ReadStringRegKey()
  75. // Desc: Helper function to read a registry key string
  76. //-----------------------------------------------------------------------------
  77. HRESULT DXUtil_ReadStringRegKey( HKEY hKey, TCHAR* strRegName, TCHAR* strValue, 
  78.                                  DWORD dwLength, TCHAR* strDefault )
  79. {
  80.     DWORD dwType;
  81.     if( ERROR_SUCCESS != RegQueryValueEx( hKey, strRegName, 0, &dwType, 
  82.                                           (BYTE*)strValue, &dwLength ) )
  83.     {
  84.         _tcscpy( strValue, strDefault );
  85.     }
  86.     return S_OK;
  87. }
  88. //-----------------------------------------------------------------------------
  89. // Name: DXUtil_WriteStringRegKey()
  90. // Desc: Helper function to write a registry key string
  91. //-----------------------------------------------------------------------------
  92. HRESULT DXUtil_WriteStringRegKey( HKEY hKey, TCHAR* strRegName,
  93.                                   TCHAR* strValue )
  94. {
  95.     if( ERROR_SUCCESS != RegSetValueEx( hKey, strRegName, 0, REG_SZ, 
  96.                                         (BYTE*)strValue, 
  97.                                         (_tcslen(strValue)+1)*sizeof(TCHAR) ) )
  98.         return E_FAIL;
  99.     return S_OK;
  100. }
  101. //-----------------------------------------------------------------------------
  102. // Name: DXUtil_ReadIntRegKey()
  103. // Desc: Helper function to read a registry key int
  104. //-----------------------------------------------------------------------------
  105. HRESULT DXUtil_ReadIntRegKey( HKEY hKey, TCHAR* strRegName, DWORD* pdwValue, 
  106.                               DWORD dwDefault )
  107. {
  108.     DWORD dwType;
  109.     DWORD dwLength = sizeof(DWORD);
  110.     if( ERROR_SUCCESS != RegQueryValueEx( hKey, strRegName, 0, &dwType, 
  111.                                           (BYTE*)pdwValue, &dwLength ) )
  112.     {
  113.         *pdwValue = dwDefault;
  114.     }
  115.     return S_OK;
  116. }
  117. //-----------------------------------------------------------------------------
  118. // Name: DXUtil_WriteIntRegKey()
  119. // Desc: Helper function to write a registry key int
  120. //-----------------------------------------------------------------------------
  121. HRESULT DXUtil_WriteIntRegKey( HKEY hKey, TCHAR* strRegName, DWORD dwValue )
  122. {
  123.     if( ERROR_SUCCESS != RegSetValueEx( hKey, strRegName, 0, REG_DWORD, 
  124.                                         (BYTE*)&dwValue, sizeof(DWORD) ) )
  125.         return E_FAIL;
  126.     return S_OK;
  127. }
  128. //-----------------------------------------------------------------------------
  129. // Name: DXUtil_ReadBoolRegKey()
  130. // Desc: Helper function to read a registry key BOOL
  131. //-----------------------------------------------------------------------------
  132. HRESULT DXUtil_ReadBoolRegKey( HKEY hKey, TCHAR* strRegName, BOOL* pbValue, 
  133.                               BOOL bDefault )
  134. {
  135.     DWORD dwType;
  136.     DWORD dwLength = sizeof(BOOL);
  137.     if( ERROR_SUCCESS != RegQueryValueEx( hKey, strRegName, 0, &dwType, 
  138.                                           (BYTE*)pbValue, &dwLength ) )
  139.     {
  140.         *pbValue = bDefault;
  141.     }
  142.     return S_OK;
  143. }
  144. //-----------------------------------------------------------------------------
  145. // Name: DXUtil_WriteBoolRegKey()
  146. // Desc: Helper function to write a registry key BOOL
  147. //-----------------------------------------------------------------------------
  148. HRESULT DXUtil_WriteBoolRegKey( HKEY hKey, TCHAR* strRegName, BOOL bValue )
  149. {
  150.     if( ERROR_SUCCESS != RegSetValueEx( hKey, strRegName, 0, REG_DWORD, 
  151.                                         (BYTE*)&bValue, sizeof(BOOL) ) )
  152.         return E_FAIL;
  153.     return S_OK;
  154. }
  155. //-----------------------------------------------------------------------------
  156. // Name: DXUtil_ReadGuidRegKey()
  157. // Desc: Helper function to read a registry key guid
  158. //-----------------------------------------------------------------------------
  159. HRESULT DXUtil_ReadGuidRegKey( HKEY hKey, TCHAR* strRegName, GUID* pGuidValue, 
  160.                                GUID& guidDefault )
  161. {
  162.     DWORD dwType;
  163.     DWORD dwLength = sizeof(GUID);
  164.     if( ERROR_SUCCESS != RegQueryValueEx( hKey, strRegName, 0, &dwType, 
  165.                                           (LPBYTE) pGuidValue, &dwLength ) )
  166.     {
  167.         *pGuidValue = guidDefault;
  168.     }
  169.     return S_OK;
  170. }
  171. //-----------------------------------------------------------------------------
  172. // Name: DXUtil_WriteGuidRegKey()
  173. // Desc: Helper function to write a registry key guid
  174. //-----------------------------------------------------------------------------
  175. HRESULT DXUtil_WriteGuidRegKey( HKEY hKey, TCHAR* strRegName, GUID guidValue )
  176. {
  177.     if( ERROR_SUCCESS != RegSetValueEx( hKey, strRegName, 0, REG_BINARY, 
  178.                                         (BYTE*)&guidValue, sizeof(GUID) ) )
  179.         return E_FAIL;
  180.     return S_OK;
  181. }
  182. //-----------------------------------------------------------------------------
  183. // Name: DXUtil_Timer()
  184. // Desc: Performs timer opertations. Use the following commands:
  185. //          TIMER_RESET           - to reset the timer
  186. //          TIMER_START           - to start the timer
  187. //          TIMER_STOP            - to stop (or pause) the timer
  188. //          TIMER_ADVANCE         - to advance the timer by 0.1 seconds
  189. //          TIMER_GETABSOLUTETIME - to get the absolute system time
  190. //          TIMER_GETAPPTIME      - to get the current time
  191. //          TIMER_GETELAPSEDTIME  - to get the time that elapsed between 
  192. //                                  TIMER_GETELAPSEDTIME calls
  193. //-----------------------------------------------------------------------------
  194. FLOAT __stdcall DXUtil_Timer( TIMER_COMMAND command )
  195. {
  196.     static BOOL     m_bTimerInitialized = FALSE;
  197.     static BOOL     m_bUsingQPF         = FALSE;
  198.     static LONGLONG m_llQPFTicksPerSec  = 0;
  199.     // Initialize the timer
  200.     if( FALSE == m_bTimerInitialized )
  201.     {
  202.         m_bTimerInitialized = TRUE;
  203.         // Use QueryPerformanceFrequency() to get frequency of timer.  If QPF is
  204.         // not supported, we will timeGetTime() which returns milliseconds.
  205.         LARGE_INTEGER qwTicksPerSec;
  206.         m_bUsingQPF = QueryPerformanceFrequency( &qwTicksPerSec );
  207.         if( m_bUsingQPF )
  208.             m_llQPFTicksPerSec = qwTicksPerSec.QuadPart;
  209.     }
  210.     if( m_bUsingQPF )
  211.     {
  212.         static LONGLONG m_llStopTime        = 0;
  213.         static LONGLONG m_llLastElapsedTime = 0;
  214.         static LONGLONG m_llBaseTime        = 0;
  215.         double fTime;
  216.         double fElapsedTime;
  217.         LARGE_INTEGER qwTime;
  218.         
  219.         // Get either the current time or the stop time, depending
  220.         // on whether we're stopped and what command was sent
  221.         if( m_llStopTime != 0 && command != TIMER_START && command != TIMER_GETABSOLUTETIME)
  222.             qwTime.QuadPart = m_llStopTime;
  223.         else
  224.             QueryPerformanceCounter( &qwTime );
  225.         // Return the elapsed time
  226.         if( command == TIMER_GETELAPSEDTIME )
  227.         {
  228.             fElapsedTime = (double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec;
  229.             m_llLastElapsedTime = qwTime.QuadPart;
  230.             return (FLOAT) fElapsedTime;
  231.         }
  232.     
  233.         // Return the current time
  234.         if( command == TIMER_GETAPPTIME )
  235.         {
  236.             double fAppTime = (double) ( qwTime.QuadPart - m_llBaseTime ) / (double) m_llQPFTicksPerSec;
  237.             return (FLOAT) fAppTime;
  238.         }
  239.     
  240.         // Reset the timer
  241.         if( command == TIMER_RESET )
  242.         {
  243.             m_llBaseTime        = qwTime.QuadPart;
  244.             m_llLastElapsedTime = qwTime.QuadPart;
  245.             return 0.0f;
  246.         }
  247.     
  248.         // Start the timer
  249.         if( command == TIMER_START )
  250.         {
  251.             m_llBaseTime += qwTime.QuadPart - m_llStopTime;
  252.             m_llStopTime = 0;
  253.             m_llLastElapsedTime = qwTime.QuadPart;
  254.             return 0.0f;
  255.         }
  256.     
  257.         // Stop the timer
  258.         if( command == TIMER_STOP )
  259.         {
  260.             m_llStopTime = qwTime.QuadPart;
  261.             m_llLastElapsedTime = qwTime.QuadPart;
  262.             return 0.0f;
  263.         }
  264.     
  265.         // Advance the timer by 1/10th second
  266.         if( command == TIMER_ADVANCE )
  267.         {
  268.             m_llStopTime += m_llQPFTicksPerSec/10;
  269.             return 0.0f;
  270.         }
  271.         if( command == TIMER_GETABSOLUTETIME )
  272.         {
  273.             fTime = qwTime.QuadPart / (double) m_llQPFTicksPerSec;
  274.             return (FLOAT) fTime;
  275.         }
  276.         return -1.0f; // Invalid command specified
  277.     }
  278.     else
  279.     {
  280.         // Get the time using timeGetTime()
  281.         static double m_fLastElapsedTime  = 0.0;
  282.         static double m_fBaseTime         = 0.0;
  283.         static double m_fStopTime         = 0.0;
  284.         double fTime;
  285.         double fElapsedTime;
  286.         
  287.         // Get either the current time or the stop time, depending
  288.         // on whether we're stopped and what command was sent
  289.         if( m_fStopTime != 0.0 && command != TIMER_START && command != TIMER_GETABSOLUTETIME)
  290.             fTime = m_fStopTime;
  291.         else
  292.             fTime = timeGetTime() * 0.001;
  293.     
  294.         // Return the elapsed time
  295.         if( command == TIMER_GETELAPSEDTIME )
  296.         {   
  297.             fElapsedTime = (double) (fTime - m_fLastElapsedTime);
  298.             m_fLastElapsedTime = fTime;
  299.             return (FLOAT) fElapsedTime;
  300.         }
  301.     
  302.         // Return the current time
  303.         if( command == TIMER_GETAPPTIME )
  304.         {
  305.             return (FLOAT) (fTime - m_fBaseTime);
  306.         }
  307.     
  308.         // Reset the timer
  309.         if( command == TIMER_RESET )
  310.         {
  311.             m_fBaseTime         = fTime;
  312.             m_fLastElapsedTime  = fTime;
  313.             return 0.0f;
  314.         }
  315.     
  316.         // Start the timer
  317.         if( command == TIMER_START )
  318.         {
  319.             m_fBaseTime += fTime - m_fStopTime;
  320.             m_fStopTime = 0.0f;
  321.             m_fLastElapsedTime  = fTime;
  322.             return 0.0f;
  323.         }
  324.     
  325.         // Stop the timer
  326.         if( command == TIMER_STOP )
  327.         {
  328.             m_fStopTime = fTime;
  329.             return 0.0f;
  330.         }
  331.     
  332.         // Advance the timer by 1/10th second
  333.         if( command == TIMER_ADVANCE )
  334.         {
  335.             m_fStopTime += 0.1f;
  336.             return 0.0f;
  337.         }
  338.         if( command == TIMER_GETABSOLUTETIME )
  339.         {
  340.             return (FLOAT) fTime;
  341.         }
  342.         return -1.0f; // Invalid command specified
  343.     }
  344. }
  345. //-----------------------------------------------------------------------------
  346. // Name: DXUtil_ConvertAnsiStringToWide()
  347. // Desc: This is a UNICODE conversion utility to convert a CHAR string into a
  348. //       WCHAR string. cchDestChar defaults -1 which means it 
  349. //       assumes strDest is large enough to store strSource
  350. //-----------------------------------------------------------------------------
  351. VOID DXUtil_ConvertAnsiStringToWide( WCHAR* wstrDestination, const CHAR* strSource, 
  352.                                      int cchDestChar )
  353. {
  354.     if( wstrDestination==NULL || strSource==NULL )
  355.         return;
  356.     if( cchDestChar == -1 )
  357.         cchDestChar = strlen(strSource)+1;
  358.     MultiByteToWideChar( CP_ACP, 0, strSource, -1, 
  359.                          wstrDestination, cchDestChar-1 );
  360.     wstrDestination[cchDestChar-1] = 0;
  361. }
  362. //-----------------------------------------------------------------------------
  363. // Name: DXUtil_ConvertWideStringToAnsi()
  364. // Desc: This is a UNICODE conversion utility to convert a WCHAR string into a
  365. //       CHAR string. cchDestChar defaults -1 which means it 
  366. //       assumes strDest is large enough to store strSource
  367. //-----------------------------------------------------------------------------
  368. VOID DXUtil_ConvertWideStringToAnsi( CHAR* strDestination, const WCHAR* wstrSource, 
  369.                                      int cchDestChar )
  370. {
  371.     if( strDestination==NULL || wstrSource==NULL )
  372.         return;
  373.     if( cchDestChar == -1 )
  374.         cchDestChar = wcslen(wstrSource)+1;
  375.     WideCharToMultiByte( CP_ACP, 0, wstrSource, -1, strDestination, 
  376.                          cchDestChar-1, NULL, NULL );
  377.     strDestination[cchDestChar-1] = 0;
  378. }
  379. //-----------------------------------------------------------------------------
  380. // Name: DXUtil_ConvertGenericStringToAnsi()
  381. // Desc: This is a UNICODE conversion utility to convert a TCHAR string into a
  382. //       CHAR string. cchDestChar defaults -1 which means it 
  383. //       assumes strDest is large enough to store strSource
  384. //-----------------------------------------------------------------------------
  385. VOID DXUtil_ConvertGenericStringToAnsi( CHAR* strDestination, const TCHAR* tstrSource, 
  386.                                         int cchDestChar )
  387. {
  388.     if( strDestination==NULL || tstrSource==NULL )
  389.         return;
  390. #ifdef _UNICODE
  391.     DXUtil_ConvertWideStringToAnsi( strDestination, tstrSource, cchDestChar );
  392. #else
  393.     if( cchDestChar == -1 )
  394.      strcpy( strDestination, tstrSource );
  395.     else
  396.      strncpy( strDestination, tstrSource, cchDestChar );
  397. #endif
  398. }
  399. //-----------------------------------------------------------------------------
  400. // Name: DXUtil_ConvertGenericStringToWide()
  401. // Desc: This is a UNICODE conversion utility to convert a TCHAR string into a
  402. //       WCHAR string. cchDestChar defaults -1 which means it 
  403. //       assumes strDest is large enough to store strSource
  404. //-----------------------------------------------------------------------------
  405. VOID DXUtil_ConvertGenericStringToWide( WCHAR* wstrDestination, const TCHAR* tstrSource, 
  406.                                         int cchDestChar )
  407. {
  408.     if( wstrDestination==NULL || tstrSource==NULL )
  409.         return;
  410. #ifdef _UNICODE
  411.     if( cchDestChar == -1 )
  412.     wcscpy( wstrDestination, tstrSource );
  413.     else
  414.     wcsncpy( wstrDestination, tstrSource, cchDestChar );
  415. #else
  416.     DXUtil_ConvertAnsiStringToWide( wstrDestination, tstrSource, cchDestChar );
  417. #endif
  418. }
  419. //-----------------------------------------------------------------------------
  420. // Name: DXUtil_ConvertAnsiStringToGeneric()
  421. // Desc: This is a UNICODE conversion utility to convert a CHAR string into a
  422. //       TCHAR string. cchDestChar defaults -1 which means it 
  423. //       assumes strDest is large enough to store strSource
  424. //-----------------------------------------------------------------------------
  425. VOID DXUtil_ConvertAnsiStringToGeneric( TCHAR* tstrDestination, const CHAR* strSource, 
  426.                                         int cchDestChar )
  427. {
  428.     if( tstrDestination==NULL || strSource==NULL )
  429.         return;
  430.         
  431. #ifdef _UNICODE
  432.     DXUtil_ConvertAnsiStringToWide( tstrDestination, strSource, cchDestChar );
  433. #else
  434.     if( cchDestChar == -1 )
  435.      strcpy( tstrDestination, strSource );
  436.     else
  437.      strncpy( tstrDestination, strSource, cchDestChar );
  438. #endif
  439. }
  440. //-----------------------------------------------------------------------------
  441. // Name: DXUtil_ConvertAnsiStringToGeneric()
  442. // Desc: This is a UNICODE conversion utility to convert a WCHAR string into a
  443. //       TCHAR string. cchDestChar defaults -1 which means it 
  444. //       assumes strDest is large enough to store strSource
  445. //-----------------------------------------------------------------------------
  446. VOID DXUtil_ConvertWideStringToGeneric( TCHAR* tstrDestination, const WCHAR* wstrSource, 
  447.                                         int cchDestChar )
  448. {
  449.     if( tstrDestination==NULL || wstrSource==NULL )
  450.         return;
  451. #ifdef _UNICODE
  452.     if( cchDestChar == -1 )
  453.     wcscpy( tstrDestination, wstrSource );
  454.     else
  455.     wcsncpy( tstrDestination, wstrSource, cchDestChar );
  456. #else
  457.     DXUtil_ConvertWideStringToAnsi( tstrDestination, wstrSource, cchDestChar );
  458. #endif
  459. }
  460. //-----------------------------------------------------------------------------
  461. // Name: _DbgOut()
  462. // Desc: Outputs a message to the debug stream
  463. //-----------------------------------------------------------------------------
  464. HRESULT _DbgOut( TCHAR* strFile, DWORD dwLine, HRESULT hr, TCHAR* strMsg )
  465. {
  466.     TCHAR buffer[256];
  467.     wsprintf( buffer, _T("%s(%ld): "), strFile, dwLine );
  468.     OutputDebugString( buffer );
  469.     OutputDebugString( strMsg );
  470.     if( hr )
  471.     {
  472.         wsprintf( buffer, _T("(hr=%08lx)n"), hr );
  473.         OutputDebugString( buffer );
  474.     }
  475.     OutputDebugString( _T("n") );
  476.     return hr;
  477. }
  478. //-----------------------------------------------------------------------------
  479. // Name: DXUtil_Trace()
  480. // Desc: Outputs to the debug stream a formatted string with a variable-
  481. //       argument list.
  482. //-----------------------------------------------------------------------------
  483. VOID DXUtil_Trace( TCHAR* strMsg, ... )
  484. {
  485. #if defined(DEBUG) | defined(_DEBUG)
  486.     TCHAR strBuffer[512];
  487.     
  488.     va_list args;
  489.     va_start(args, strMsg);
  490.     _vsntprintf( strBuffer, 512, strMsg, args );
  491.     va_end(args);
  492.     OutputDebugString( strBuffer );
  493. #endif
  494. }