- Changed I_InitInput() to acquire the IDirectInput8A interface by using

DirectInput8Create() instead of CoCreateInstance(). This allows the Steam
  GameOverlayRenderer.dll to properly hook it.


SVN r1422 (trunk)
This commit is contained in:
Randy Heit 2009-02-10 03:12:41 +00:00
parent d444fc54fd
commit 085be22a30
2 changed files with 38 additions and 49 deletions

View file

@ -1,4 +1,7 @@
February 9, 2009 February 9, 2009
- Changed I_InitInput() to acquire the IDirectInput8A interface by using
DirectInput8Create() instead of CoCreateInstance(). This allows the Steam
GameOverlayRenderer.dll to properly hook it.
- Stopped sending double the number of wheel events as appropriate to the - Stopped sending double the number of wheel events as appropriate to the
console under Linux. console under Linux.
- Added middle mouse button selection pasting for X systems. - Added middle mouse button selection pasting for X systems.

View file

@ -97,6 +97,7 @@
#include "templates.h" #include "templates.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "d_event.h" #include "d_event.h"
#include "v_text.h"
#define DINPUT_BUFFERSIZE 32 #define DINPUT_BUFFERSIZE 32
@ -1451,65 +1452,50 @@ bool I_InitInput (void *hwnd)
// Try for DirectInput 8 first, then DirectInput 3 for NT 4's benefit. // Try for DirectInput 8 first, then DirectInput 3 for NT 4's benefit.
hr = CoCreateInstance (CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInput8A, (void**)&g_pdi); DInputDLL = LoadLibrary("dinput8.dll");
if (FAILED(hr)) if (DInputDLL != NULL)
{ {
g_pdi = NULL; typedef HRESULT (*blah)(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN);
} blah di8c = (blah)GetProcAddress(DInputDLL, "DirectInput8Create");
else if (di8c != NULL)
{
hr = g_pdi->Initialize (g_hInst, 0x0800);
if (FAILED (hr))
{ {
g_pdi->Release (); hr = di8c(g_hInst, DIRECTINPUT_VERSION, IID_IDirectInput8A, (void **)&g_pdi, NULL);
g_pdi = NULL; if (FAILED(hr))
{
Printf(TEXTCOLOR_ORANGE "DirectInput8Create failed: %08lx", hr);
g_pdi = NULL; // Just to be sure DirectInput8Create didn't change it
}
}
else
{
Printf(TEXTCOLOR_ORANGE "Could not find DirectInput8Create in dinput8.dll\n");
} }
} }
if (g_pdi == NULL) if (g_pdi == NULL)
{ {
hr = CoCreateInstance (CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInputA, (void**)&g_pdi3); if (DInputDLL != NULL)
if (hr == REGDB_E_CLASSNOTREG)
{ {
// NT 4 has the wrong GUID in the registry for CLSID_DirectInput unless somebody has already FreeLibrary(DInputDLL);
// used "regsvr32 dinput.dll" to properly register the class. This means the only sure way to
// obtain an IDirectInputA interface under NT 4 is to actually load the DLL and use
// the function it provides. Grrr.
DInputDLL = LoadLibrary ("dinput.dll");
if (DInputDLL == NULL)
{
I_FatalError ("Could not load dinput.dll: %08lx", GetLastError());
}
typedef HRESULT (*blah)(HINSTANCE, DWORD, LPDIRECTINPUT*, LPUNKNOWN);
blah dic = (blah)GetProcAddress (DInputDLL, "DirectInputCreateA");
if (dic == NULL)
{
I_FatalError ("dinput.dll is corrupt");
}
hr = dic (g_hInst, 0x0300, &g_pdi3, NULL);
if (FAILED(hr))
{
I_FatalError ("DirectInputCreate failed: %08lx", hr);
}
Printf ("Tip for NT 4: \"regsvr32 dinput.dll\"\n");
} }
else DInputDLL = LoadLibrary ("dinput.dll");
if (DInputDLL == NULL)
{ {
if (FAILED(hr)) I_FatalError ("Could not load dinput.dll: %08lx", GetLastError());
{ }
I_FatalError ("Could not create DirectInput interface: %08lx", hr);
} typedef HRESULT (*blah)(HINSTANCE, DWORD, LPDIRECTINPUT*, LPUNKNOWN);
hr = g_pdi3->Initialize (g_hInst, 0x0300); blah dic = (blah)GetProcAddress (DInputDLL, "DirectInputCreateA");
if (FAILED(hr))
{ if (dic == NULL)
g_pdi3->Release (); {
g_pdi3 = NULL; I_FatalError ("dinput.dll is corrupt");
I_FatalError ("Could not initialize DirectInput interface: %08lx", hr); }
}
hr = dic (g_hInst, 0x0300, &g_pdi3, NULL);
if (FAILED(hr))
{
I_FatalError ("DirectInputCreate failed: %08lx", hr);
} }
} }