⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtractor.c

📁 读取音乐光盘磁道为磁盘文件的DLL源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	MessageBox( NULL, "Unable to allocate default CD device", "X-Tractor",
		    MB_APPLMODAL | MB_ICONSTOP | MB_OK );
      else
	{
	  BYTE i;
	  // locate the drive in the list of available drives
	  for( i = 0; i < cdlist.num; i++ )
	    {
	      if ( (cdh.ha  == cdlist.cd[i].ha) &&
		   (cdh.tgt == cdlist.cd[i].tgt) &&
		   (cdh.lun == cdlist.cd[i].lun) )
		cdlistIdx = i;
	    }
	}
    }
  else
    {
      hCD = findAvailableCD( );
    }

  if ( !readRegSZ( hKey, "wavOutputDir", szWavOutputDir, MAX_PATH + 1 ) )
    GetCurrentDirectory( MAX_PATH + 1, szWavOutputDir );

  if ( !readRegSZ( hKey, "mp3OutputDir", szMP3OutputDir, MAX_PATH + 1 ) )
    GetCurrentDirectory( MAX_PATH + 1, szMP3OutputDir );

  asSetID3Info( ID3_TITLE, "", 0 );
  asSetID3Info( ID3_ARTIST, "", 0 );
  asSetID3Info( ID3_ALBUM, "", 0 );
  asSetID3Info( ID3_YEAR, "", 0 );
  asSetID3Info( ID3_GENRE, NULL, 0 );

  if ( hKey )
    RegCloseKey( hKey );
}


HCDROM findAvailableCD( void )
{
  GETCDHAND cdh;
  BYTE i;

  if ( hCD )
    {
      CloseCDHandle( hCD );
      hCD = NULL;
    }

  ZeroMemory( &cdh, sizeof(cdh) );
  for( i = 0; i < cdlist.num && !hCD; i++ )
    {
      cdh.size        = sizeof(GETCDHAND);
      cdh.ver         = 1;
      cdh.ha          = cdlist.cd[i].ha;
      cdh.tgt         = cdlist.cd[i].tgt;
      cdh.lun         = cdlist.cd[i].lun;
      cdh.readType    = bReadType;
      cdh.numOverlap  = numOverlap;
      cdh.numJitter   = jitterCheck;
      hCD = GetCDHandle( &cdh );
      if ( hCD )
	cdlistIdx = i;
    }

  return hCD;
}


/*
 * Reads a DWORD from the registry given an already open key
 * The value read is stored into pdw, and the function returns
 * 0 if it fails
 */
int readRegDWORD( HKEY hKey, LPCTSTR lpszValue, DWORD *pdw )
{
  DWORD dwSize = 4L;
  DWORD dwType;
  LONG retVal;

  retVal = RegQueryValueEx( hKey, lpszValue, NULL, &dwType, (LPBYTE)pdw,
			    &dwSize );
  if ( retVal != ERROR_SUCCESS )
    {
      return 0;
    }

  return -1;
}
 

/*
 * Reads an ASCIIZ string from the registry given an already open key
 * The value read is stored into lpszData, and the function returns
 * 0 if it fails
 */
int readRegSZ( HKEY hKey, LPCTSTR lpszValue, LPSTR lpszData, DWORD dwDataLen )
{
  DWORD dwType;
  LONG retVal;

  retVal = RegQueryValueEx( hKey, lpszValue, NULL, &dwType, (LPBYTE)lpszData,
			    &dwDataLen );
  if ( (retVal != ERROR_SUCCESS) || (dwType != REG_SZ) )
    {
      return 0;
    }

  return -1;
}


/*
 * Sets the registry to disable autoplay under Win95.  Probably won't
 * work under NT due to security settings
 */
void disableAutoPlay( void )
{
  HKEY hKey;
  unsigned long ulDisable = (unsigned long)0xFF;
  DWORD dwDataSize = sizeof( ulDisable );
  DWORD dwDataType;
  LONG lErr = 0;

  if ( ( lErr = RegOpenKeyEx( HKEY_CURRENT_USER, regAutoPlay, 0,
		     KEY_ALL_ACCESS, &hKey ) ) == ERROR_SUCCESS )
    {
      if ( RegQueryValueEx( hKey, "NoDriveTypeAutoRun", 0, NULL,
			    (unsigned char *)&ulOldAutorun,
			    &dwDataSize ) == ERROR_SUCCESS )
	{
	  RegSetValueEx( hKey, "NoDriveTypeAutoRun", 0, REG_BINARY,
			 (unsigned char *)&ulDisable, 4 );
	}
      else
	ulOldAutorun = (unsigned long)0x95;

      RegFlushKey( hKey );
      RegCloseKey( hKey );
    }

  if ( ( lErr = RegOpenKeyEx( HKEY_CLASSES_ROOT, regAutoAudioCD, 0,
                              KEY_ALL_ACCESS, &hKey ) ) == ERROR_SUCCESS )
    {
      dwDataSize = 256;
      if ( RegQueryValueEx( hKey, "", NULL, &dwDataType,
                            szOldAutoPlay,
                            &dwDataSize ) == ERROR_SUCCESS )
        {
          RegSetValueEx( hKey, "", 0, REG_SZ, (unsigned char *)"", 1 );
        }

      RegFlushKey( hKey );
      RegCloseKey( hKey );
    }
}


void restoreAutoPlay( void )
{
  HKEY hKey;

  if ( RegOpenKeyEx( HKEY_CURRENT_USER, regAutoPlay, 0,
		     KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS )
    {
      RegSetValueEx( hKey, "NoDriveTypeAutoRun", 0, REG_BINARY,
		     (unsigned char *)&ulOldAutorun, 4 );

      RegFlushKey( hKey );
      RegCloseKey( hKey );
    }

  if ( RegOpenKeyEx( HKEY_CLASSES_ROOT, regAutoAudioCD, 0,
                     KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS )
    {
      RegSetValueEx( hKey, "", 0, REG_SZ,
                     (unsigned char *)&szOldAutoPlay,
                     lstrlen(szOldAutoPlay)+1 );

      RegFlushKey( hKey );
      RegCloseKey( hKey );
    }
}


BOOL DirExists( char *dir )
{
  char curDir[MAX_PATH+1];
  //  BOOL bSet;

  if ( !GetCurrentDirectory( MAX_PATH + 1, curDir ) )
    return FALSE;

  if ( !SetCurrentDirectory( dir ) )
     return FALSE;
  SetCurrentDirectory( curDir );

  return TRUE;
}


void MSB2DWORD( DWORD *d, BYTE *b )
{
  DWORD retVal;

  retVal = (DWORD)b[0];
  retVal = (retVal<<8) + (DWORD)b[1];
  retVal = (retVal<<8) + (DWORD)b[2];
  retVal = (retVal<<8) + (DWORD)b[3];

  *d = retVal;
}


void GetEditItemText( int iCtlId, HWND hCtl )
{
  char buf[31];

  ZeroMemory( buf, 31 );
  SendMessage( hCtl, WM_GETTEXT, 31, (LPARAM)buf );
  switch( iCtlId )
    {
    case IDE_ARTIST:
      asSetID3Info( ID3_ARTIST, buf, 0 );
      break;
    case IDE_ALBUM:
      asSetID3Info( ID3_ALBUM, buf, 0 );
      break;
    }
}


void SetEditItemText( int iCtlId, char *s )
{
  switch( iCtlId )
    {
    case IDE_ARTIST:
      SendMessage( hEditArtist, WM_SETTEXT, 0, (LPARAM)s );
      break;
    case IDE_ALBUM:
      SendMessage( hEditAlbum, WM_SETTEXT, 0, (LPARAM)s );
      break;
    }
}



void CheckEnableID3MenuItem( HWND hWnd )
{
  HMENU hPopup;

  hPopup = GetSubMenu( GetMenu(hWnd), 3 ); // get handle to Tools menu
  if ( bID3 )
    CheckMenuItem( hPopup, IDM_ENABLEID3, MF_BYCOMMAND | MF_CHECKED );
  else
    CheckMenuItem( hPopup, IDM_ENABLEID3, MF_BYCOMMAND | MF_UNCHECKED );
}


void CheckEnableCDDBMenuItem( HWND hWnd )
{
  HMENU hPopup;

  hPopup = GetSubMenu( GetMenu(hWnd), 3 ); // get handle to Tools menu
  if ( bCDDB )
    CheckMenuItem( hPopup, IDM_ENABLECDDB, MF_BYCOMMAND | MF_CHECKED );
  else
    CheckMenuItem( hPopup, IDM_ENABLECDDB, MF_BYCOMMAND | MF_UNCHECKED );
}


void CheckEnableHiColorMenuItem( HWND hWnd )
{
  HMENU hPopup;

  hPopup = GetSubMenu( GetMenu(hWnd), 2 );  //options menu
  if ( bHiColor )
    CheckMenuItem( hPopup, IDM_HICOLOR, MF_BYCOMMAND | MF_CHECKED );
  else
    CheckMenuItem( hPopup, IDM_HICOLOR, MF_BYCOMMAND | MF_UNCHECKED );
}



void ShowHelpFile( HWND hWnd, int topic )
{
  char buf[MAX_PATH+1];

  topic = topic;

  GetCurrentDirectory( MAX_PATH+1, buf );
  lstrcat( buf, "\\help" );
  ShellExecute( hWnd, "open", "index.html", NULL, buf, SW_SHOWNORMAL );
}



void setRipTrackStatus( LPENCODETHREAD e )
{
  char buf[61];
  char buf2[81];
  char *p = buf;
  double d;
  int a,b;

  time( &e->tnow );
  d = difftime( e->tnow, e->tstart );
  switch( e->status )
    {
    case EST_SUCCESS:
      lstrcpy( buf, "OK, " );
      DiffTimeToString( d, buf+4 );
      p += lstrlen( buf );
      d = ((double)(e->trackLen/75)) / d;
      a = d;
      b = ((d-(double)a) * 100.0);
      wsprintf( p, ", %s: %d.%02dx", bMP3?"rip/encode":"rip", a, b );
      wsprintf( buf2, "lstrlen(buf) == %d", lstrlen(buf) );
      OutputDebugString( buf2 );
      break;
    case EST_ERROR:
      wsprintf( buf, "Error: 0x%04X", GetAspiLibAspiError() );
      break;
    case EST_ABORTED:
      lstrcpy( buf, "Rip Aborted" );
      break;
    default:
      lstrcpy( buf, "" );
      break;
    }
  SendMessage( hTrackWnd, WM_SETTRACKSTATUS, (WPARAM)e->idx,
	       (LPARAM)buf );
}

void DiffTimeToString( double d, char *buf )
{
  unsigned long hrs, min, sec;
  
  hrs = (unsigned long)(d / 3600.0);
  min = (unsigned long)((d - (double)((hrs) * 3600))/60.0);
  sec = ((unsigned long)d) - (hrs)*3600 - (min)*60;

  wsprintf( buf, "%02d:%02d", hrs * 60 + min, sec );
}

static void GetLineFromBuf( char *tgt, char **src, int len )
{
  char *p;

  if ( !src || !*src || !tgt )
    return;

  p = *src;

  ZeroMemory( tgt, len );
  len--;

  while( *p && len )
    {
      if ( *p == '\n' )
        break;
      *tgt++ = *p;
      p++;
      len--;
    }

  // advance *src to end of last read string
  if ( *p == '\n' )
    p++;
  *src = p;

  len = lstrlen( tgt );
  if ( tgt[len-2] == '\r' )
    tgt[len-2] = '\0';
  if ( (tgt[len-1] == '\r') || (tgt[len-1] == '\n') )
    tgt[len-1] = '\0';
}


#if 0
LRESULT CALLBACK Edit0Proc( HWND hWnd, UINT uMsg, WPARAM wParam,
			    LPARAM lParam )
{
  WNDPROC lpfnWndProc;
  lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );

  logMessage( 0, uMsg, wParam, lParam );

  return lpfnWndProc( hWnd, uMsg, wParam, lParam );
}

LRESULT CALLBACK Edit1Proc( HWND hWnd, UINT uMsg, WPARAM wParam,
			    LPARAM lParam )
{
  WNDPROC lpfnWndProc;
  lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );

  logMessage( 1, uMsg, wParam, lParam );

  return lpfnWndProc( hWnd, uMsg, wParam, lParam );
}

LRESULT CALLBACK Edit2Proc( HWND hWnd, UINT uMsg, WPARAM wParam,
			    LPARAM lParam )
{
  WNDPROC lpfnWndProc;
  lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );

  logMessage( 2, uMsg, wParam, lParam );

  return lpfnWndProc( hWnd, uMsg, wParam, lParam );
}


void logMessage( int which, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  char buf[128];
  char *p;

  p = buf;
  wsprintf( buf, "%d: ", which );
  p += lstrlen( p );

  switch( uMsg )
    {
    case WM_SETCURSOR:
    case WM_MOUSEMOVE:
    case WM_NCHITTEST:
    case WM_NCMOUSEMOVE:
    case WM_PAINT:
    case WM_NCPAINT:
      return;

    case WM_MOUSEACTIVATE:
      wsprintf( p, "WM_MOUSEACTIVATE  0x%08X  0x%08X", wParam, lParam );
      break;

    case WM_GETDLGCODE:
      wsprintf( p, "WM_GETDLGCODE  0x%08X  0x%08X", wParam, lParam );
      break;

    case WM_LBUTTONDOWN:
      wsprintf( p, "WM_LBUTTONDOWN  0x%08X  0x%08X", wParam, lParam );
      break;

    case WM_LBUTTONUP:
      wsprintf( p, "WM_LBUTTONUP  0x%08X  0x%08X", wParam, lParam );
      break;

    case WM_KILLFOCUS:
      wsprintf( p, "WM_KILLFOCUS  0x%08X  0x%08X", wParam, lParam );
      break;

    case WM_SETFOCUS:
      wsprintf( p, "WM_SETFOCUS  0x%08X  0x%08X", wParam, lParam );
      break;

    case WM_CAPTURECHANGED:
      wsprintf( p, "WM_CAPTURECHANGED  0x%08X  0x%08X", wParam, lParam );
      break;

    default:
      wsprintf( p, "unknown 0x%04X (%d)", uMsg, uMsg );
      break;
    }

  OutputDebugString( buf );
}
#endif



void dbprintf( char *fmt, ... )
{
  char buf[512];
  va_list arg;

  va_start( arg, fmt );

  vsprintf( buf, fmt, arg );
  OutputDebugString( buf );

  va_end( arg );
}

/*
 * Attempt to determine the version of comctl32.dll available.
 */
#if (!_CONFIG_DLLVERINFO)
typedef struct
{
  DWORD cbSize;
  DWORD dwMajorVersion;
  DWORD dwMinorVersion;
  DWORD dwBuildNumber;
  DWORD dwPlatformID;
} DLLVERSIONINFO;
typedef HRESULT CALLBACK (*DLLGETVERSIONPROC)(DLLVERSIONINFO *);
#endif

DWORD GetDllVersion( LPCTSTR lpszDllName )
{
  HINSTANCE hDll;
  DWORD retVal = 0;

  hDll = LoadLibrary( lpszDllName );
  if ( hDll )
    {
      DLLGETVERSIONPROC pDllGetVer;

      pDllGetVer = (DLLGETVERSIONPROC)GetProcAddress( hDll, "DllGetVersion" );
      if ( pDllGetVer )
	{
	  DLLVERSIONINFO dvi;
	  HRESULT hr;

	  ZeroMemory( &dvi, sizeof(dvi) );
	  dvi.cbSize = sizeof(dvi);

	  hr = (*pDllGetVer)(&dvi);
	  if ( SUCCEEDED(hr) )
	    {
	      retVal = MAKELONG( dvi.dwMajorVersion, dvi.dwMinorVersion );
	    }

	  FreeLibrary( hDll );
	}
    }

  return retVal;
}


/*
 * Returns TRUE if color depth >= 16 bpp
 */
BOOL DisplayIsHiColor( void )
{
  HDC hDC;
  int iBPP;

  hDC = GetDC( NULL );

  iBPP = GetDeviceCaps( hDC, BITSPIXEL );

  ReleaseDC( NULL, hDC );

  return (iBPP >= 16);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -