00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright © 2000-2002 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 #include "OgreD3D7RenderSystem.h" 00026 #include "OgreDDDriverList.h" 00027 #include "OgreDDDriver.h" 00028 #include "OgreLogManager.h" 00029 #include "OgreException.h" 00030 00031 namespace Ogre { 00032 00033 // Non-member callback functions 00034 static BOOL WINAPI DDEnumCallbackEx(GUID FAR *lpGUID, 00035 LPSTR lpDriverDescription, 00036 LPSTR lpDriverName, 00037 LPVOID lpContext, 00038 HMONITOR hm) 00039 { 00040 00041 DDDriverList* driverList; 00042 00043 // Use context pointer to add this new object to the list 00044 driverList = (DDDriverList*)lpContext; 00045 driverList->AddDriver(lpGUID, lpDriverDescription, lpDriverName); 00046 00047 00048 // Continue enumeration (to find other cards) 00049 return TRUE; 00050 } 00051 00052 static BOOL WINAPI DDEnumCallback(GUID FAR *lpGUID, 00053 LPSTR lpDriverDescription, 00054 LPSTR lpDriverName, 00055 LPVOID lpContext) 00056 { 00057 return DDEnumCallbackEx(lpGUID,lpDriverDescription,lpDriverName,lpContext,NULL); 00058 } 00059 00060 DDDriverList::DDDriverList() 00061 { 00062 // Default constructor 00063 // Will create a new driver list and enumerate it 00064 00065 // Enumerate the list 00066 enumerate(); 00067 00068 } 00069 00070 DDDriverList::~DDDriverList() 00071 { 00072 for(size_t i=0; i<count(); i++) 00073 { 00074 item(i)->Cleanup(); 00075 } 00076 // Release drivers 00077 mDriverList.clear(); 00078 } 00079 00080 BOOL DDDriverList::enumerate() 00081 { 00082 00083 LPDIRECTDRAWENUMERATEEX lpDDEnumEx; 00084 HINSTANCE h; 00085 00086 LogManager::getSingleton().logMessage("----- DirectDraw Detection Starts"); 00087 00088 h = LoadLibrary("ddraw.dll"); 00089 00090 // If ddraw.dll doesn't exist in the search path, 00091 // then DirectX probably isn't installed, so fail. 00092 if (!h) 00093 throw Exception(0, "Error loading ddraw.dll", "DDDriverList - enumerate"); 00094 00095 // Note that you must know which version of the 00096 // function to retrieve (see the following text). 00097 // For this example, we use the ANSI version. 00098 lpDDEnumEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(h,"DirectDrawEnumerateExA"); 00099 // If the function is there, call it to enumerate all display 00100 // devices attached to the desktop, and any non-display DirectDraw 00101 // devices. 00102 if (lpDDEnumEx) 00103 lpDDEnumEx(DDEnumCallbackEx, this, 00104 DDENUM_ATTACHEDSECONDARYDEVICES | 00105 DDENUM_NONDISPLAYDEVICES ); 00106 else 00107 { 00108 /* 00109 * We must be running on an old version of DirectDraw. 00110 * Therefore MultiMon isn't supported. Fall back on 00111 * DirectDrawEnumerate to enumerate standard devices on a 00112 * single-monitor system. 00113 */ 00114 DirectDrawEnumerate(DDEnumCallback,this); 00115 00116 } 00117 // If the library was loaded by calling LoadLibrary(), 00118 // then you must use FreeLibrary() to let go of it. 00119 00120 FreeLibrary(h); 00121 00122 LogManager::getSingleton().logMessage("----- DirectDraw Detection Ends"); 00123 00124 return TRUE; 00125 } 00126 00127 void DDDriverList::AddDriver( 00128 GUID FAR *lpGuid, 00129 LPSTR lpDriverDesc, 00130 LPSTR lpDriverName ) 00131 { 00132 mDriverList.push_back( DDDriver(lpGuid, lpDriverDesc, lpDriverName) ); 00133 00134 LogManager::getSingleton().logMessage( LML_NORMAL, "Detected DirectDraw driver %s.\n", lpDriverDesc ); 00135 } 00136 00137 size_t DDDriverList::count(void) const 00138 { 00139 return mDriverList.size(); 00140 } 00141 00142 DDDriver* DDDriverList::item(size_t index) 00143 { 00144 return &mDriverList.at( index ); 00145 } 00146 }
Copyright © 2002-2003 by The OGRE Team
Last modified Fri May 14 23:22:06 2004