1367 lines
39 KiB
C++
1367 lines
39 KiB
C++
|
|
||
|
// Direct.cpp : Implementation of DLL Exports.
|
||
|
|
||
|
// To fully complete this project follow these steps
|
||
|
|
||
|
// You will need the new MIDL compiler to build this project. Additionally,
|
||
|
// if you are building the proxy stub DLL, you will need new headers and libs.
|
||
|
|
||
|
// 1) Add a custom build step to Direct.idl
|
||
|
// You can select all of the .IDL files by holding Ctrl and clicking on
|
||
|
// each of them.
|
||
|
//
|
||
|
// Description
|
||
|
// Running MIDL
|
||
|
// Build Command(s)
|
||
|
// midl Direct.idl
|
||
|
// Outputs
|
||
|
// Direct.tlb
|
||
|
// Direct.h
|
||
|
// Direct_i.c
|
||
|
//
|
||
|
// NOTE: You must use the MIDL compiler from NT 4.0,
|
||
|
// preferably 3.00.15 or greater
|
||
|
//
|
||
|
// 2) Add a custom build step to the project to register the DLL
|
||
|
// For this, you can select all projects at once
|
||
|
// Description
|
||
|
// Registering OLE Server...
|
||
|
// Build Command(s)
|
||
|
// regsvr32 /s /c "$(TargetPath)"
|
||
|
// echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
|
||
|
// Outputs
|
||
|
// $(OutDir)\regsvr32.trg
|
||
|
|
||
|
// 3) To add UNICODE support, follow these steps
|
||
|
// Select Build|Configurations...
|
||
|
// Press Add...
|
||
|
// Change the configuration name to Unicode Release
|
||
|
// Change the "Copy Settings From" combo to Direct - Win32 Release
|
||
|
// Press OK
|
||
|
// Press Add...
|
||
|
// Change the configuration name to Unicode Debug
|
||
|
// Change the "Copy Settings From" combo to Direct - Win32 Debug
|
||
|
// Press OK
|
||
|
// Press "Close"
|
||
|
// Select Build|Settings...
|
||
|
// Select the two UNICODE projects and press the C++ tab.
|
||
|
// Select the "General" category
|
||
|
// Add _UNICODE to the Preprocessor definitions
|
||
|
// Select the Unicode Debug project
|
||
|
// Press the "General" tab
|
||
|
// Specify DebugU for the intermediate and output directories
|
||
|
// Select the Unicode Release project
|
||
|
// Press the "General" tab
|
||
|
// Specify ReleaseU for the intermediate and output directories
|
||
|
|
||
|
// 4) Proxy stub DLL
|
||
|
// To build a separate proxy/stub DLL,
|
||
|
// run nmake -f ps.mak in the project directory.
|
||
|
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "d3d8.h"
|
||
|
|
||
|
#include "resource.h"
|
||
|
#include "initguid.h"
|
||
|
#include "Direct.h"
|
||
|
#include "dms.h"
|
||
|
|
||
|
#include "DxGlob7Obj.h"
|
||
|
#include "d3dx8obj.h"
|
||
|
#include "dSoundObj.h"
|
||
|
#include "dSoundBufferObj.h"
|
||
|
#include "dSound3DListener.h"
|
||
|
#include "dSound3DBuffer.h"
|
||
|
#include "dSoundCaptureObj.h"
|
||
|
#include "dSoundCaptureBufferObj.h"
|
||
|
|
||
|
|
||
|
#include "DPlayPeerObj.h"
|
||
|
#include "dPlayVoiceClientObj.h"
|
||
|
|
||
|
#include "dInput1Obj.h"
|
||
|
#include "dInputDeviceObj.h"
|
||
|
|
||
|
#define IID_DEFINED
|
||
|
#include "Direct_i.c"
|
||
|
|
||
|
// When floating-point types are used, the compiler emits a reference to
|
||
|
// _fltused to initialize the CRT's floating-point package. We're not
|
||
|
// using any of that support and the OS is responsible for initializing
|
||
|
// the FPU, so we'll link to the following _fltused instead to avoid CRT
|
||
|
// bloat.
|
||
|
//
|
||
|
// win2k doesnt like this so its been removed
|
||
|
// #ifdef NDEBUG
|
||
|
// extern "C" int _fltused = 0;
|
||
|
// #endif
|
||
|
|
||
|
|
||
|
|
||
|
// ATL COM OBJECT MAP
|
||
|
CComModule _Module;
|
||
|
BEGIN_OBJECT_MAP(ObjectMap)
|
||
|
OBJECT_ENTRY(CLSID__dxj_DirectX8, C_dxj_DirectX7Object)
|
||
|
OBJECT_ENTRY(CLSID_D3DX8, C_dxj_D3DX8Object)
|
||
|
END_OBJECT_MAP()
|
||
|
|
||
|
//
|
||
|
// thanks to precompiled headers, we never get this properly!
|
||
|
//
|
||
|
#undef DEFINE_GUID
|
||
|
#define __based(a)
|
||
|
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||
|
EXTERN_C const GUID CDECL __based(__segname("_CODE")) name \
|
||
|
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
|
||
|
|
||
|
|
||
|
|
||
|
// MISC GLOBALS
|
||
|
static const char c_szWav[] = "WAVE";
|
||
|
long g_debuglevel=0;
|
||
|
extern "C" int nObjects = 0;
|
||
|
BOOL is4Bit = FALSE;
|
||
|
int g_creationcount=0;
|
||
|
CRITICAL_SECTION g_cbCriticalSection;
|
||
|
OSVERSIONINFOW sysinfo;
|
||
|
|
||
|
// HANDLES TO DX DLLS
|
||
|
HINSTANCE g_hDSoundHandle=NULL;
|
||
|
HINSTANCE g_hDPlay=NULL;
|
||
|
HINSTANCE g_hInstDINPUTDLL=NULL;
|
||
|
HINSTANCE g_hInstD3DXOFDLL=NULL;
|
||
|
HINSTANCE g_hInst=NULL;
|
||
|
HINSTANCE g_hD3D8=NULL;
|
||
|
|
||
|
|
||
|
|
||
|
void *g_dxj_DirectSound3dListener = 0;
|
||
|
void *g_dxj_DirectSoundBuffer = 0;
|
||
|
void *g_dxj_DirectSoundPrimaryBuffer = 0;
|
||
|
void *g_dxj_DirectSound3dBuffer = 0;
|
||
|
void *g_dxj_DirectSound = 0;
|
||
|
void *g_dxj_DirectSoundCapture = 0;
|
||
|
void *g_dxj_DirectSoundCaptureBuffer = 0;
|
||
|
#if 0
|
||
|
void *g_dxj_DirectMusic = 0;
|
||
|
void *g_dxj_DirectSoundWave = 0;
|
||
|
void *g_dxj_DirectSoundDownloadedWave = 0;
|
||
|
void *g_dxj_DirectSoundSink = 0;
|
||
|
void *g_dxj_DirectSoundSource = 0;
|
||
|
void *g_dxj_ReferenceClock = 0;
|
||
|
void *g_dxj_DirectMusicVoice = 0;
|
||
|
void *g_dxj_DirectMusicPort = 0;
|
||
|
void *g_dxj_DirectMusicBuffer = 0;
|
||
|
#endif
|
||
|
|
||
|
void *g_dxj_DirectSoundFXSend = 0;
|
||
|
void *g_dxj_DirectSoundFXChorus = 0;
|
||
|
void *g_dxj_DirectSoundFXFlanger = 0;
|
||
|
void *g_dxj_DirectSoundFXEcho = 0;
|
||
|
void *g_dxj_DirectSoundFXDistortion = 0;
|
||
|
void *g_dxj_DirectSoundFXGargle = 0;
|
||
|
void *g_dxj_DirectSoundFXCompressor = 0;
|
||
|
void *g_dxj_DirectSoundFXI3DL2Source = 0;
|
||
|
void *g_dxj_DirectSoundFXI3DL2Reverb = 0;
|
||
|
void *g_dxj_DirectSoundFXParamEQ = 0;
|
||
|
void *g_dxj_DirectSoundFXWavesReverb = 0;
|
||
|
|
||
|
void *g_dxj_DirectInput8 = 0;
|
||
|
void *g_dxj_DirectInputDevice8 = 0;
|
||
|
void *g_dxj_DirectInputEffect = 0;
|
||
|
|
||
|
void *g_dxj_DirectMusicLoader = 0;
|
||
|
void *g_dxj_DirectMusicPerformance = 0;
|
||
|
void *g_dxj_DirectMusicComposer = 0;
|
||
|
void *g_dxj_DirectMusicStyle = 0;
|
||
|
void *g_dxj_DirectMusicBand = 0;
|
||
|
void *g_dxj_DirectMusicChordMap = 0;
|
||
|
void *g_dxj_DirectMusicSegment = 0;
|
||
|
void *g_dxj_DirectMusicSegmentState = 0;
|
||
|
void *g_dxj_DirectMusicCollection = 0;
|
||
|
void *g_dxj_DirectMusicAudioPath = 0;
|
||
|
void *g_dxj_DirectMusicSong = 0;
|
||
|
|
||
|
void *g_dxj_DirectPlayVoiceClient = 0;
|
||
|
void *g_dxj_DirectPlayVoiceServer = 0;
|
||
|
void *g_dxj_DirectPlayVoiceSetup = 0;
|
||
|
void *g_dxj_DirectPlay = 0;
|
||
|
void *g_dxj_DirectPlayPeer = 0;
|
||
|
void *g_dxj_DirectPlayServer = 0;
|
||
|
void *g_dxj_DirectPlayClient = 0;
|
||
|
void *g_dxj_DirectPlayAddress = 0;
|
||
|
void *g_dxj_DirectPlayLobbyClient = 0;
|
||
|
void *g_dxj_DirectPlayLobbiedApplication= 0;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// DLL LOADING
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
HINSTANCE LoadD3DXOFDLL()
|
||
|
{
|
||
|
//char Path[MAX_PATH];
|
||
|
//if (!g_hInstD3DXOFDLL)
|
||
|
//{
|
||
|
// GetSystemDirectory( Path, MAX_PATH );
|
||
|
// strcat(Path, "\\d3dXOF.dll" );
|
||
|
// g_hInstD3DXOFDLL=LoadLibrary(Path);
|
||
|
//}
|
||
|
|
||
|
if (!g_hInstD3DXOFDLL) g_hInstD3DXOFDLL=LoadLibrary("d3dXOF.dll");
|
||
|
return g_hInstD3DXOFDLL;
|
||
|
}
|
||
|
|
||
|
|
||
|
HINSTANCE LoadD3D8DLL()
|
||
|
{
|
||
|
|
||
|
if (!g_hD3D8) g_hD3D8=LoadLibrary("d3d8.dll");
|
||
|
return g_hD3D8;
|
||
|
}
|
||
|
|
||
|
HINSTANCE LoadDSoundDLL()
|
||
|
{
|
||
|
//char Path[MAX_PATH];
|
||
|
//if (!g_hDSoundHandle)
|
||
|
//{
|
||
|
// GetSystemDirectory( Path, MAX_PATH );
|
||
|
// strcat(Path, "\\dsound.dll" );
|
||
|
// g_hDSoundHandle=LoadLibrary( Path );
|
||
|
//}
|
||
|
if (!g_hDSoundHandle) g_hDSoundHandle=LoadLibrary("dsound.dll");
|
||
|
return g_hDSoundHandle;
|
||
|
}
|
||
|
|
||
|
HINSTANCE LoadDPlayDLL()
|
||
|
{
|
||
|
//char Path[MAX_PATH];
|
||
|
//if (!g_hDPlay)
|
||
|
//{
|
||
|
// GetSystemDirectory( Path, MAX_PATH );
|
||
|
// strcat(Path, "\\dplayx.dll" );
|
||
|
// g_hDPlay=LoadLibrary( Path );
|
||
|
//}
|
||
|
if (!g_hDPlay) g_hDPlay=LoadLibrary("dplayx.dll");
|
||
|
return g_hDPlay;
|
||
|
}
|
||
|
|
||
|
|
||
|
HINSTANCE LoadDINPUTDLL()
|
||
|
{
|
||
|
//if (!g_hInstDINPUTDLL) {
|
||
|
// char Path[MAX_PATH];
|
||
|
// GetSystemDirectory( Path, MAX_PATH );
|
||
|
// strcat(Path, "\\dinput8.dll" );
|
||
|
// g_hInstDINPUTDLL=LoadLibrary( Path );
|
||
|
//}
|
||
|
if (!g_hInstDINPUTDLL) g_hInstDINPUTDLL=LoadLibrary("dinput8.dll");
|
||
|
return g_hInstDINPUTDLL;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// DLL ENTRY POINTS
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DLL Entry Point
|
||
|
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
|
||
|
{
|
||
|
|
||
|
g_hInst=hInstance;
|
||
|
|
||
|
if (dwReason == DLL_PROCESS_ATTACH)
|
||
|
{
|
||
|
//
|
||
|
// Get the current display pixel depth
|
||
|
// If it is 4-bit we are in trouble.
|
||
|
//
|
||
|
HDC hDisplayIC;
|
||
|
BOOL bPalette = FALSE;
|
||
|
hDisplayIC = CreateIC("DISPLAY", NULL, NULL, NULL);
|
||
|
if (hDisplayIC)
|
||
|
{
|
||
|
if (GetDeviceCaps(hDisplayIC, BITSPIXEL) < 8)
|
||
|
is4Bit = TRUE;
|
||
|
DeleteDC(hDisplayIC);
|
||
|
}
|
||
|
|
||
|
_Module.Init(ObjectMap, hInstance);
|
||
|
DisableThreadLibraryCalls(hInstance);
|
||
|
InitializeCriticalSection(&g_cbCriticalSection);
|
||
|
|
||
|
HKEY hk=0;
|
||
|
DWORD type=REG_DWORD;
|
||
|
LONG res;
|
||
|
DWORD cbSize = sizeof(DWORD);
|
||
|
|
||
|
res=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Directx\\DXVB",&hk);
|
||
|
if (hk)
|
||
|
{
|
||
|
res=RegQueryValueEx(hk,"DebugLevel",NULL,&type,(LPBYTE)&g_debuglevel,&cbSize);
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hk);
|
||
|
|
||
|
nObjects = 0;
|
||
|
|
||
|
|
||
|
}
|
||
|
else if (dwReason == DLL_PROCESS_DETACH)
|
||
|
{
|
||
|
|
||
|
DeleteCriticalSection(&g_cbCriticalSection);
|
||
|
|
||
|
//FREE DLLS
|
||
|
if ( g_hDPlay )
|
||
|
FreeLibrary(g_hDPlay);
|
||
|
if ( g_hDSoundHandle )
|
||
|
FreeLibrary(g_hDSoundHandle);
|
||
|
if ( g_hInstDINPUTDLL )
|
||
|
FreeLibrary(g_hInstDINPUTDLL);
|
||
|
if (g_hInstD3DXOFDLL)
|
||
|
FreeLibrary(g_hInstD3DXOFDLL);
|
||
|
if (g_hD3D8)
|
||
|
FreeLibrary(g_hD3D8);
|
||
|
|
||
|
_Module.Term();
|
||
|
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Used to determine whether the DLL can be unloaded by OLE
|
||
|
STDAPI DllCanUnloadNow(void)
|
||
|
{
|
||
|
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Returns a class factory to create an object of the requested type
|
||
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
||
|
{
|
||
|
return _Module.GetClassObject(rclsid, riid, ppv);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DllRegisterServer - Adds entries to the system registry
|
||
|
STDAPI DllRegisterServer(void)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
// registers object, typelib and all interfaces in typelib
|
||
|
hRes = _Module.RegisterServer(TRUE);
|
||
|
if(hRes == S_OK)
|
||
|
{
|
||
|
//hRes = RegSecurityClass();
|
||
|
}
|
||
|
|
||
|
//now look
|
||
|
HKEY hk=0;
|
||
|
char szDocPath[MAX_PATH];
|
||
|
DWORD cb=MAX_PATH;
|
||
|
LONG res;
|
||
|
DWORD type=REG_SZ;
|
||
|
|
||
|
ZeroMemory(szDocPath,MAX_PATH);
|
||
|
|
||
|
res=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Directx",&hk);
|
||
|
if ((ERROR_SUCCESS!=res)||(hk==0) )
|
||
|
return hRes;
|
||
|
|
||
|
|
||
|
|
||
|
res=RegQueryValueEx(hk,"DX81SDK Doc Path",NULL,&type,(LPBYTE)szDocPath,&cb);
|
||
|
RegCloseKey(hk);
|
||
|
|
||
|
if (ERROR_SUCCESS!=res) return hRes;
|
||
|
|
||
|
hk=0;
|
||
|
|
||
|
res=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\CLASSES\\TypeLib\\{E1211242-8E94-11d1-8808-00C04FC2C603}\\1.0\\HELPDIR",&hk);
|
||
|
if (ERROR_SUCCESS!=res) return hRes;
|
||
|
|
||
|
RegSetValueEx(hk,NULL,0,REG_SZ,(LPBYTE)szDocPath,cb);
|
||
|
RegCloseKey(hk);
|
||
|
|
||
|
|
||
|
return hRes;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DllUnregisterServer - Adds entries to the system registry
|
||
|
STDAPI DllUnregisterServer(void)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
hRes = _Module.UnregisterServer();
|
||
|
if(hRes == S_OK)
|
||
|
{
|
||
|
//hRes = UnRegSecurityClass();
|
||
|
}
|
||
|
|
||
|
return hRes;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// GUID CONVERSION FUNCTIONS
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// GUIDS_EQUAL - consider moving to dms.h
|
||
|
|
||
|
#define GUIDS_EQUAL(g,g2) (\
|
||
|
(g.Data1==g2->Data1) && \
|
||
|
(g.Data2==g2->Data2) && \
|
||
|
(g.Data3==g2->Data3) && \
|
||
|
(g.Data4[0]==g2->Data4[0]) && \
|
||
|
(g.Data4[1]==g2->Data4[1]) && \
|
||
|
(g.Data4[2]==g2->Data4[2]) && \
|
||
|
(g.Data4[3]==g2->Data4[3]) && \
|
||
|
(g.Data4[4]==g2->Data4[4]) && \
|
||
|
(g.Data4[5]==g2->Data4[5]) && \
|
||
|
(g.Data4[6]==g2->Data4[6]) && \
|
||
|
(g.Data4[7]==g2->Data4[7]) )
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// GUIDtoBSTR - does conversion
|
||
|
|
||
|
BSTR GUIDtoBSTR(LPGUID pGuid){
|
||
|
char szOut[256];
|
||
|
char szTemp[10];
|
||
|
char *pAt=NULL;
|
||
|
int i;
|
||
|
BSTR bstrOut;
|
||
|
|
||
|
// 00000000001111111111222222222233333333
|
||
|
// 01234567890123456789012345678901234567
|
||
|
// {XXXXXXXX-XXXX-XXXX-X XXX-XXXXXXXXXXXX}
|
||
|
if (pGuid!=NULL){
|
||
|
|
||
|
szOut[0]='{';
|
||
|
|
||
|
wsprintf(&(szOut)[1],"%.8X",pGuid->Data1);
|
||
|
|
||
|
szOut[9]='-';
|
||
|
|
||
|
wsprintf(szTemp,"%.4X",pGuid->Data2);
|
||
|
memcpy(&(szOut[10]),szTemp,4);
|
||
|
|
||
|
szOut[14]='-';
|
||
|
|
||
|
wsprintf(szTemp,"%.4X",pGuid->Data3);
|
||
|
memcpy(&(szOut[15]),szTemp,4);
|
||
|
|
||
|
szOut[19]='-';
|
||
|
|
||
|
for (i=0;i<2;i++){
|
||
|
wsprintf(szTemp,"%.2X",pGuid->Data4[i]);
|
||
|
memcpy(&(szOut[20+i*2]),szTemp,2);
|
||
|
|
||
|
}
|
||
|
|
||
|
szOut[24]='-';
|
||
|
|
||
|
for (i=2;i<8;i++){
|
||
|
wsprintf(szTemp,"%.2X",pGuid->Data4[i]);
|
||
|
memcpy(&(szOut[21+i*2]),szTemp,2);
|
||
|
|
||
|
}
|
||
|
|
||
|
szOut[37]='}';
|
||
|
szOut[38]='\0';
|
||
|
|
||
|
USES_CONVERSION;
|
||
|
bstrOut = T2BSTR(szOut);
|
||
|
|
||
|
}
|
||
|
else {
|
||
|
bstrOut = T2BSTR("");
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
return bstrOut;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// convertChar
|
||
|
// helper for GUIDtoBSTR
|
||
|
HRESULT convertChar(char *szIn,int i,char *valOut){
|
||
|
int val[2]; //using int for easy out of bounds check
|
||
|
|
||
|
char c;
|
||
|
int j;
|
||
|
|
||
|
for (j=0;j<2;j++){
|
||
|
c= szIn[i+j];
|
||
|
switch (c)
|
||
|
{
|
||
|
case 'a':
|
||
|
case 'A':
|
||
|
val[j]=10;
|
||
|
break;
|
||
|
case 'b':
|
||
|
case 'B':
|
||
|
val[j]=11;
|
||
|
break;
|
||
|
case 'c':
|
||
|
case 'C':
|
||
|
val[j]=12;
|
||
|
break;
|
||
|
case 'd':
|
||
|
case 'D':
|
||
|
val[j]=13;
|
||
|
break;
|
||
|
|
||
|
case 'e':
|
||
|
case 'E':
|
||
|
val[j]=14;
|
||
|
break;
|
||
|
case 'f':
|
||
|
case 'F':
|
||
|
val[j]=15;
|
||
|
break;
|
||
|
default:
|
||
|
val[j]=c-'0';
|
||
|
if (val[j]<0) return E_INVALIDARG;
|
||
|
if (val[j]>15) return E_INVALIDARG;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
*valOut=(char)((val[0]<<4)|val[1]);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// BSTRtoGUID - does conversion
|
||
|
//
|
||
|
HRESULT BSTRtoGUID(LPGUID pGuid, BSTR bstr){
|
||
|
HRESULT hr;
|
||
|
//byte
|
||
|
//
|
||
|
//
|
||
|
//char
|
||
|
// 1111111111222222222233333333
|
||
|
// 01234567890123456789012345678901234567
|
||
|
// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
|
||
|
USES_CONVERSION;
|
||
|
if(!pGuid) return E_INVALIDARG;
|
||
|
ZeroMemory(pGuid,sizeof(GUID));
|
||
|
if (!bstr) return S_OK;
|
||
|
|
||
|
if (bstr[0]==0x00) return S_OK;
|
||
|
|
||
|
LPSTR szGuid=W2T(bstr);
|
||
|
|
||
|
//first and last char should be { }
|
||
|
if ((szGuid[0]!='{')||(szGuid[37]!='}'))
|
||
|
return E_INVALIDARG;
|
||
|
if ((szGuid[9]!='-')||(szGuid[14]!='-')||(szGuid[19]!='-')||(szGuid[24]!='-'))
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
char val;
|
||
|
char *pData=(char*)pGuid;
|
||
|
int j=0;
|
||
|
int i;
|
||
|
|
||
|
//FIRST DWORD
|
||
|
for ( i=7;i>=1;i=i-2){
|
||
|
hr=convertChar(szGuid,i,&val);
|
||
|
if FAILED(hr) return hr;
|
||
|
pData[j++]=val;
|
||
|
}
|
||
|
|
||
|
//FIRST WORD
|
||
|
for ( i=12;i>=10;i=i-2){
|
||
|
hr=convertChar(szGuid,i,&val);
|
||
|
if FAILED(hr) return hr;
|
||
|
pData[j++]=val;
|
||
|
}
|
||
|
|
||
|
//2nd WORD
|
||
|
for ( i=17;i>=15;i=i-2){
|
||
|
hr=convertChar(szGuid,i,&val);
|
||
|
if FAILED(hr) return hr;
|
||
|
pData[j++]=val;
|
||
|
}
|
||
|
|
||
|
|
||
|
//3rd DWORD - BYTE ARRAY
|
||
|
for ( i=20;i<24;i=i+2){
|
||
|
hr=convertChar(szGuid,i,&val);
|
||
|
if FAILED(hr) return hr;
|
||
|
pData[j++]=val;
|
||
|
}
|
||
|
|
||
|
//BYTE ARRAY
|
||
|
for ( i=25;i<37;i=i+2){
|
||
|
hr=convertChar(szGuid,i,&val);
|
||
|
if FAILED(hr) return hr;
|
||
|
pData[j++]=val;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//
|
||
|
HRESULT BSTRtoPPGUID(LPGUID *ppGuid, BSTR bstr){
|
||
|
if (!ppGuid) return E_INVALIDARG;
|
||
|
if ((bstr==NULL)||(bstr[0]=='\0')){
|
||
|
*ppGuid=NULL;
|
||
|
return S_OK;
|
||
|
}
|
||
|
return BSTRtoGUID(*ppGuid,bstr);
|
||
|
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// D3DBSTRtoGUID - does conversion
|
||
|
//
|
||
|
HRESULT D3DBSTRtoGUID(LPGUID pGuid,BSTR str){
|
||
|
HRESULT hr=S_OK;
|
||
|
|
||
|
if (!pGuid) return E_INVALIDARG;
|
||
|
if (!str) {
|
||
|
ZeroMemory(pGuid,sizeof(GUID));
|
||
|
return S_OK;
|
||
|
}
|
||
|
//if( 0==_wcsicmp(str,L"iid_idirect3drgbdevice")){
|
||
|
// memcpy(pGuid,&IID_IDirect3DRGBDevice,sizeof(GUID));
|
||
|
//}
|
||
|
//else if( 0==_wcsicmp(str,L"iid_idirect3dhaldevice")){
|
||
|
// memcpy(pGuid,&IID_IDirect3DHALDevice,sizeof(GUID));
|
||
|
//}
|
||
|
//else if( 0==_wcsicmp(str,L"iid_idirect3dmmxdevice")){
|
||
|
// memcpy(pGuid,&IID_IDirect3DMMXDevice,sizeof(GUID));
|
||
|
//}
|
||
|
//else if( 0==_wcsicmp(str,L"iid_idirect3drefdevice")){
|
||
|
// memcpy(pGuid,&IID_IDirect3DRefDevice,sizeof(GUID));
|
||
|
//}
|
||
|
//else if( 0==_wcsicmp(str,L"iid_idirect3dnulldevice")){
|
||
|
// memcpy(pGuid,&IID_IDirect3DNullDevice,sizeof(GUID));
|
||
|
//}
|
||
|
//else {
|
||
|
// hr = BSTRtoGUID(pGuid,str);
|
||
|
//}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// D3DGUIDtoBSTR - does conversion
|
||
|
//
|
||
|
BSTR D3DGUIDtoBSTR(LPGUID pg){
|
||
|
|
||
|
HRESULT hr=S_OK;
|
||
|
WCHAR *pStr=NULL;
|
||
|
|
||
|
if (!pg)
|
||
|
return NULL;
|
||
|
//else if (GUIDS_EQUAL(IID_IDirect3DNullDevice,pg)){
|
||
|
// pStr=L"IID_IDirect3DNullDevice";
|
||
|
//}
|
||
|
//else if (GUIDS_EQUAL(IID_IDirect3DRefDevice,pg)){
|
||
|
// pStr=L"IID_IDirect3DRefDevice";
|
||
|
//}
|
||
|
//else if (GUIDS_EQUAL(IID_IDirect3DMMXDevice,pg)){
|
||
|
// pStr=L"IID_IDirect3DMMXDevice";
|
||
|
//}
|
||
|
//
|
||
|
//else if (GUIDS_EQUAL(IID_IDirect3DHALDevice,pg)){
|
||
|
// pStr=L"IID_IDirect3DHALDevice";
|
||
|
//}
|
||
|
//else if (GUIDS_EQUAL(IID_IDirect3DRGBDevice,pg)){
|
||
|
// pStr=L"IID_IDirect3DRGBDevice";
|
||
|
//}
|
||
|
//
|
||
|
|
||
|
if (pStr){
|
||
|
return DXALLOCBSTR(pStr);
|
||
|
}
|
||
|
else {
|
||
|
return GUIDtoBSTR(pg);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DSOUNDEFFECTSBSTRtoGUID - does conversion
|
||
|
//
|
||
|
HRESULT AudioBSTRtoGUID(LPGUID pGuid,BSTR str){
|
||
|
HRESULT hr=S_OK;
|
||
|
|
||
|
if (!pGuid) return E_INVALIDARG;
|
||
|
|
||
|
if (!str) {
|
||
|
ZeroMemory(pGuid,sizeof(GUID));
|
||
|
return S_OK;
|
||
|
}
|
||
|
#if 0
|
||
|
if( 0==_wcsicmp(str,L"guid_dsfx_send")){
|
||
|
memcpy(pGuid,&GUID_DSFX_SEND,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxsend")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXSend,sizeof(GUID));
|
||
|
}
|
||
|
#endif
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_chorus")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_CHORUS,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_flanger")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_FLANGER,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_echo")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_ECHO,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_distortion")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_DISTORTION,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_compressor")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_COMPRESSOR,sizeof(GUID));
|
||
|
}
|
||
|
#if 0
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_i3dl2source")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_I3DL2SOURCE,sizeof(GUID));
|
||
|
}
|
||
|
#endif
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_i3dl2reverb")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_I3DL2REVERB,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_gargle")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_GARGLE,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_standard_parameq")){
|
||
|
memcpy(pGuid,&GUID_DSFX_STANDARD_PARAMEQ,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_dsfx_waves_reverb")){
|
||
|
memcpy(pGuid,&GUID_DSFX_WAVES_REVERB,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxgargle")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXGargle,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxchorus")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXChorus,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxcompressor")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXCompressor,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxdistortion")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXDistortion,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxecho")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXEcho,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxflanger")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXFlanger,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxi3dl2reverb")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXI3DL2Reverb,sizeof(GUID));
|
||
|
}
|
||
|
#if 0
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxi3dl2source")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXI3DL2Source,sizeof(GUID));
|
||
|
}
|
||
|
#endif
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxparameq")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXParamEq,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_directsoundfxwavesreverb")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundFXWavesReverb,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"ds3dalg_default")){
|
||
|
memcpy(pGuid,&DS3DALG_DEFAULT,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"ds3dalg_no_virtualization")){
|
||
|
memcpy(pGuid,&DS3DALG_NO_VIRTUALIZATION,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"ds3dalg_hrtf_full")){
|
||
|
memcpy(pGuid,&DS3DALG_HRTF_FULL,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"ds3dalg_hrtf_light")){
|
||
|
memcpy(pGuid,&DS3DALG_HRTF_LIGHT,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultplayback")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultPlayback,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultcapture")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultCapture,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultvoiceplayback")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultVoicePlayback,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultvoicecapture")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultVoiceCapture,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_idirectsoundbuffer8")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundBuffer8,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_idirectsoundbuffer")){
|
||
|
memcpy(pGuid,&IID_IDirectSoundBuffer,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_idirectsound3dlistener")){
|
||
|
memcpy(pGuid,&IID_IDirectSound3DListener,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_all_objects")){
|
||
|
memcpy(pGuid,&GUID_All_Objects,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"iid_idirectsound3dbuffer")){
|
||
|
memcpy(pGuid,&IID_IDirectSound3DBuffer,sizeof(GUID));
|
||
|
}
|
||
|
else {
|
||
|
hr = BSTRtoGUID(pGuid,str);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DPLAYBSTRtoGUID - does conversion
|
||
|
//
|
||
|
HRESULT DPLAYBSTRtoGUID(LPGUID pGuid,BSTR str){
|
||
|
HRESULT hr=S_OK;
|
||
|
|
||
|
if (!pGuid) return E_INVALIDARG;
|
||
|
|
||
|
if (!str) {
|
||
|
ZeroMemory(pGuid,sizeof(GUID));
|
||
|
return S_OK;
|
||
|
}
|
||
|
if( 0==_wcsicmp(str,L"clsid_dp8sp_tcpip")){
|
||
|
memcpy(pGuid,&CLSID_DP8SP_TCPIP,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"clsid_dp8sp_ipx")){
|
||
|
memcpy(pGuid,&CLSID_DP8SP_IPX,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"clsid_dp8sp_modem")){
|
||
|
memcpy(pGuid,&CLSID_DP8SP_MODEM,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"clsid_dp8sp_serial")){
|
||
|
memcpy(pGuid,&CLSID_DP8SP_SERIAL,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultplayback")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultPlayback,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultcapture")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultCapture,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultvoiceplayback")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultVoicePlayback,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"dsdevid_defaultvoicecapture")){
|
||
|
memcpy(pGuid,&DSDEVID_DefaultVoiceCapture,sizeof(GUID));
|
||
|
}
|
||
|
else {
|
||
|
hr = BSTRtoGUID(pGuid,str);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DINPUTGUIDtoBSTR
|
||
|
//
|
||
|
BSTR DINPUTGUIDtoBSTR(LPGUID pg){
|
||
|
|
||
|
HRESULT hr=S_OK;
|
||
|
WCHAR *pStr=NULL;
|
||
|
|
||
|
if (!pg)
|
||
|
return NULL;
|
||
|
else if (GUIDS_EQUAL(GUID_XAxis,pg)){
|
||
|
pStr=L"GUID_XAxis";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_YAxis,pg)){
|
||
|
pStr=L"GUID_YAxis";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_ZAxis,pg)){
|
||
|
pStr=L"GUID_ZAxis";
|
||
|
}
|
||
|
|
||
|
else if (GUIDS_EQUAL(GUID_RxAxis,pg)){
|
||
|
pStr=L"GUID_RxAxis";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_RyAxis,pg)){
|
||
|
pStr=L"GUID_RyAxis";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_RzAxis,pg)){
|
||
|
pStr=L"GUID_RzAxis";
|
||
|
}
|
||
|
|
||
|
else if (GUIDS_EQUAL(GUID_Slider,pg)){
|
||
|
pStr=L"GUID_Slider";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Button,pg)){
|
||
|
pStr=L"GUID_Button";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Key,pg)){
|
||
|
pStr=L"GUID_Key";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_POV,pg)){
|
||
|
pStr=L"GUID_POV";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Unknown,pg)){
|
||
|
pStr=L"GUID_Unknown";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_SysMouse,pg)){
|
||
|
pStr=L"GUID_SysMouse";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_SysKeyboard,pg)){
|
||
|
pStr=L"GUID_SysKeyboard";
|
||
|
}
|
||
|
|
||
|
|
||
|
else if (GUIDS_EQUAL(GUID_ConstantForce,pg)){
|
||
|
pStr=L"GUID_ConstantForce";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Square,pg)){
|
||
|
pStr=L"GUID_Square";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Sine,pg)){
|
||
|
pStr=L"GUID_Sine";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Triangle,pg)){
|
||
|
pStr=L"GUID_Triangle";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_SawtoothUp,pg)){
|
||
|
pStr=L"GUID_SawtoothUp";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_SawtoothDown,pg)){
|
||
|
pStr=L"GUID_SawtoothDown";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Spring,pg)){
|
||
|
pStr=L"GUID_Spring";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Damper,pg)){
|
||
|
pStr=L"GUID_Damper";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Inertia,pg)){
|
||
|
pStr=L"GUID_Inertia";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_Friction,pg)){
|
||
|
pStr=L"GUID_Friction";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_CustomForce,pg)){
|
||
|
pStr=L"GUID_CustomForce";
|
||
|
}
|
||
|
else if (GUIDS_EQUAL(GUID_RampForce,pg)){
|
||
|
pStr=L"GUID_RampForce";
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//else if (GUIDS_EQUAL(GUID_Joystick,pg)){
|
||
|
// pStr=L"GUID_JoyStick";
|
||
|
//}
|
||
|
|
||
|
if (pStr){
|
||
|
return DXALLOCBSTR(pStr);
|
||
|
}
|
||
|
else {
|
||
|
return GUIDtoBSTR(pg);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DINPUTBSTRtoGUID
|
||
|
//
|
||
|
HRESULT DINPUTBSTRtoGUID(LPGUID pGuid,BSTR str){
|
||
|
HRESULT hr=S_OK;
|
||
|
|
||
|
if (!pGuid) return E_INVALIDARG;
|
||
|
|
||
|
if (!str) {
|
||
|
ZeroMemory(pGuid,sizeof(GUID));
|
||
|
return S_OK;
|
||
|
}
|
||
|
if( 0==_wcsicmp(str,L"guid_xaxis")){
|
||
|
memcpy(pGuid,&GUID_XAxis,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_yaxis")){
|
||
|
memcpy(pGuid,&GUID_YAxis,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_zaxis")){
|
||
|
memcpy(pGuid,&GUID_ZAxis,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_rxaxis")){
|
||
|
memcpy(pGuid,&GUID_RxAxis,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_ryaxis")){
|
||
|
memcpy(pGuid,&GUID_RyAxis,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_rzaxis")){
|
||
|
memcpy(pGuid,&GUID_RzAxis,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_slider")){
|
||
|
memcpy(pGuid,&GUID_Slider,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_button")){
|
||
|
memcpy(pGuid,&GUID_Button,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_key")){
|
||
|
memcpy(pGuid,&GUID_Key,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_pov")){
|
||
|
memcpy(pGuid,&GUID_POV,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_unknown")){
|
||
|
memcpy(pGuid,&GUID_Unknown,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_sysmouse")){
|
||
|
memcpy(pGuid,&GUID_SysMouse,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_syskeyboard")){
|
||
|
memcpy(pGuid,&GUID_SysKeyboard,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_constantforce")){
|
||
|
memcpy(pGuid,&GUID_ConstantForce,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_square")){
|
||
|
memcpy(pGuid,&GUID_Square,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_sine")){
|
||
|
memcpy(pGuid,&GUID_Sine,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_triangle")){
|
||
|
memcpy(pGuid,&GUID_Triangle,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_sawtoothup")){
|
||
|
memcpy(pGuid,&GUID_SawtoothUp,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_sawtoothdown")){
|
||
|
memcpy(pGuid,&GUID_SawtoothDown,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_spring")){
|
||
|
memcpy(pGuid,&GUID_Spring,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_damper")){
|
||
|
memcpy(pGuid,&GUID_Damper,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_inertia")){
|
||
|
memcpy(pGuid,&GUID_Inertia,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_friction")){
|
||
|
memcpy(pGuid,&GUID_Friction,sizeof(GUID));
|
||
|
}
|
||
|
else if( 0==_wcsicmp(str,L"guid_customforce")){
|
||
|
memcpy(pGuid,&GUID_CustomForce,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
else if( 0==_wcsicmp(str,L"guid_rampforce")){
|
||
|
memcpy(pGuid,&GUID_RampForce,sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
//else if( 0==_wcsicmp(str,L"guid_joystick")){
|
||
|
// memcpy(pGuid,&GUID_Joystick,sizeof(GUID));
|
||
|
//}
|
||
|
else {
|
||
|
hr = BSTRtoGUID(pGuid,str);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// GENERAL HELPER FUNCTIONS
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Given an ANSI string, pass back a UNICODE string
|
||
|
// SysAllocString is your big friend here.
|
||
|
//
|
||
|
// CONSIDER finding all occerence of use and replacint with the
|
||
|
// T2BSTR macro .. much cleaner
|
||
|
//
|
||
|
extern "C" void PassBackUnicode(LPSTR str, BSTR *Name, DWORD cnt)
|
||
|
{
|
||
|
//docdoc: length header is required to be filled, but the BSTR pointer
|
||
|
// points to the first character, not the length.
|
||
|
// note, the count can never be too small as we get that from the string
|
||
|
// before we pass it in!
|
||
|
USES_CONVERSION;
|
||
|
LPWSTR lpw = (LPWSTR)malloc((cnt+1)*2);
|
||
|
if (!lpw)
|
||
|
return;
|
||
|
|
||
|
void *l = (void *)lpw;
|
||
|
lpw = AtlA2WHelper(lpw, str, cnt);
|
||
|
lpw[cnt] = 0;
|
||
|
*Name = SysAllocString(lpw);
|
||
|
free(l);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// IsAllZeros
|
||
|
//
|
||
|
BOOL IsEmptyString(BSTR szString)
|
||
|
{
|
||
|
__try {
|
||
|
if (*szString)
|
||
|
return FALSE;
|
||
|
else
|
||
|
return TRUE;
|
||
|
}
|
||
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// IsAllZeros
|
||
|
//
|
||
|
BOOL IsAllZeros(void *pStruct,DWORD size){
|
||
|
for (DWORD i=0;i<size;i++){
|
||
|
if (((char*)pStruct)[i]!='\0'){
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CopyFloats
|
||
|
//
|
||
|
extern "C" void CopyFloats(D3DVALUE *dst, D3DVALUE *src, DWORD count)
|
||
|
{
|
||
|
D3DVALUE *ptr1 = dst, *ptr2 = src;
|
||
|
|
||
|
if (!count) return;
|
||
|
|
||
|
for (; count; count--) *ptr1++ = *ptr2++;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// IsWin95
|
||
|
//
|
||
|
// no longer needed since we support w95 now
|
||
|
#if 0
|
||
|
BOOL IsWin95(void)
|
||
|
{
|
||
|
return FALSE;
|
||
|
|
||
|
|
||
|
|
||
|
//We work on win95
|
||
|
OSVERSIONINFO osvi;
|
||
|
ZeroMemory(&osvi, sizeof(osvi));
|
||
|
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
||
|
if (!GetVersionEx(&osvi))
|
||
|
{
|
||
|
DPF(1,"GetVersionEx failed - assuming Win95");
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
if ( VER_PLATFORM_WIN32_WINDOWS == osvi.dwPlatformId )
|
||
|
{
|
||
|
|
||
|
if( ( osvi.dwMajorVersion > 4UL ) ||
|
||
|
( ( osvi.dwMajorVersion == 4UL ) &&
|
||
|
( osvi.dwMinorVersion >= 10UL ) &&
|
||
|
( LOWORD( osvi.dwBuildNumber ) >= 1373 ) ) )
|
||
|
{
|
||
|
// is Win98
|
||
|
DPF(2,"Detected Win98");
|
||
|
return FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// is Win95
|
||
|
DPF(2,"Detected Win95");
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
else if ( VER_PLATFORM_WIN32_NT == osvi.dwPlatformId )
|
||
|
{
|
||
|
DPF(2,"Detected WinNT");
|
||
|
return FALSE;
|
||
|
}
|
||
|
DPF(2,"OS Detection failed");
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#define DICONDITION_USE_BOTH_AXIS 1
|
||
|
#define DICONDITION_USE_DIRECTION 2
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// FixUpRealEffect cover->real
|
||
|
//
|
||
|
HRESULT FixUpRealEffect(GUID g,DIEFFECT *realEffect,DIEFFECT_CDESC *cover)
|
||
|
{
|
||
|
if (!cover) return E_INVALIDARG;
|
||
|
|
||
|
|
||
|
memcpy(realEffect,cover,sizeof(DIEFFECT));
|
||
|
|
||
|
realEffect->dwSize =sizeof(DIEFFECT);
|
||
|
realEffect->lpEnvelope =NULL;
|
||
|
realEffect->cbTypeSpecificParams =0;
|
||
|
realEffect->lpvTypeSpecificParams =NULL;
|
||
|
realEffect->cAxes =2;
|
||
|
realEffect->dwFlags=realEffect->dwFlags | DIEFF_OBJECTOFFSETS ;
|
||
|
realEffect->rglDirection =(long*)&(cover->x);
|
||
|
realEffect->rgdwAxes =(DWORD*)&(cover->axisOffsets);
|
||
|
|
||
|
|
||
|
if (cover->bUseEnvelope){
|
||
|
realEffect->lpEnvelope=(DIENVELOPE*)&(cover->envelope);
|
||
|
|
||
|
((DIENVELOPE*)&(cover->envelope))->dwSize=sizeof(DIENVELOPE);
|
||
|
}
|
||
|
|
||
|
if (!cover->lFlags)
|
||
|
realEffect->dwFlags= DIEFF_POLAR | DIEFF_OBJECTOFFSETS ;
|
||
|
|
||
|
//constant
|
||
|
if (g==GUID_ConstantForce)
|
||
|
{
|
||
|
realEffect->cbTypeSpecificParams =sizeof (DICONSTANTFORCE);
|
||
|
realEffect->lpvTypeSpecificParams =&(cover->constantForce);
|
||
|
}
|
||
|
|
||
|
//periodic
|
||
|
else if ((g==GUID_Square)||(g==GUID_Triangle)||(g==GUID_SawtoothUp)||(g==GUID_SawtoothDown)||(g==GUID_Sine))
|
||
|
{
|
||
|
|
||
|
realEffect->cbTypeSpecificParams =sizeof (DIPERIODIC);
|
||
|
realEffect->lpvTypeSpecificParams =&(cover->periodicForce);
|
||
|
|
||
|
}
|
||
|
else if ((g==GUID_Spring)|| (g==GUID_Damper)|| (g==GUID_Inertia)|| (g==GUID_Friction)){
|
||
|
|
||
|
if (cover->conditionFlags==DICONDITION_USE_BOTH_AXIS){
|
||
|
realEffect->cbTypeSpecificParams =sizeof(DICONDITION)*2;
|
||
|
realEffect->lpvTypeSpecificParams =&(cover->conditionX);
|
||
|
}
|
||
|
else{
|
||
|
realEffect->cbTypeSpecificParams =sizeof(DICONDITION);
|
||
|
realEffect->lpvTypeSpecificParams =&(cover->conditionX);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if (g==GUID_RampForce){
|
||
|
realEffect->cbTypeSpecificParams =sizeof(DIRAMPFORCE);
|
||
|
realEffect->lpvTypeSpecificParams =&(cover->rampForce);
|
||
|
}
|
||
|
|
||
|
cover->axisOffsets.x=DIJOFS_X;
|
||
|
cover->axisOffsets.y=DIJOFS_Y;
|
||
|
realEffect->rgdwAxes=(DWORD*)&(cover->axisOffsets);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// FixUpCoverEffect real->cover
|
||
|
//
|
||
|
HRESULT FixUpCoverEffect(GUID g, DIEFFECT_CDESC *cover,DIEFFECT *realEffect)
|
||
|
{
|
||
|
|
||
|
|
||
|
ZeroMemory(cover,sizeof(DIEFFECT_CDESC));
|
||
|
memcpy(cover,realEffect,sizeof(DIEFFECT));
|
||
|
|
||
|
|
||
|
if (realEffect->lpEnvelope){
|
||
|
memcpy(&cover->envelope,realEffect->lpEnvelope ,sizeof(DIENVELOPE));
|
||
|
cover->bUseEnvelope=VARIANT_TRUE;
|
||
|
}
|
||
|
|
||
|
if (realEffect->rglDirection){
|
||
|
cover->x=realEffect->rglDirection[0];
|
||
|
cover->y=realEffect->rglDirection[1];
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if (realEffect->lpvTypeSpecificParams){
|
||
|
|
||
|
if (g==GUID_ConstantForce)
|
||
|
{
|
||
|
memcpy(&(cover->constantForce),realEffect->lpvTypeSpecificParams,sizeof(DICONSTANTFORCE));
|
||
|
}
|
||
|
//periodic
|
||
|
else if ((g==GUID_Square)||(g==GUID_Triangle)||(g==GUID_SawtoothUp)||(g==GUID_SawtoothDown)||(g==GUID_Sine))
|
||
|
{
|
||
|
memcpy(&(cover->periodicForce),realEffect->lpvTypeSpecificParams,sizeof(DIPERIODIC));
|
||
|
}
|
||
|
|
||
|
else if ((g==GUID_Spring)|| (g==GUID_Damper)|| (g==GUID_Inertia)|| (g==GUID_Friction)){
|
||
|
|
||
|
if (realEffect->cbTypeSpecificParams ==sizeof(DICONDITION)*2){
|
||
|
memcpy(&(cover->conditionY),realEffect->lpvTypeSpecificParams,sizeof(DICONDITION)*2);
|
||
|
cover->conditionFlags=DICONDITION_USE_BOTH_AXIS;
|
||
|
}
|
||
|
else{
|
||
|
memcpy(&(cover->conditionX),realEffect->lpvTypeSpecificParams,sizeof(DICONDITION));
|
||
|
cover->conditionFlags=DICONDITION_USE_DIRECTION;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
else if (g==GUID_RampForce){
|
||
|
memcpy(&(cover->rampForce),realEffect->lpvTypeSpecificParams,sizeof(DIRAMPFORCE));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#define MYVARIANTINIT(inArg,puser) \
|
||
|
VariantInit(puser); \
|
||
|
user.vt=VT_UNKNOWN; \
|
||
|
user.punkVal = inArg; \
|
||
|
user.punkVal->AddRef();
|
||
|
|