Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Unified Diff: content/browser/gamepad/platform_data_fetcher_win.cc

Issue 10781023: use Loadlibrary/GetProcAddress for XInput, rather than /DELAYLOAD (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review fixes Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/gamepad/platform_data_fetcher_win.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/gamepad/platform_data_fetcher_win.cc
diff --git a/content/browser/gamepad/platform_data_fetcher_win.cc b/content/browser/gamepad/platform_data_fetcher_win.cc
index 752328ae3e8d8141fcd1a349de1f1782a670f02f..8a50a38694e3ba7409644ed04ec67f2b270dec9c 100644
--- a/content/browser/gamepad/platform_data_fetcher_win.cc
+++ b/content/browser/gamepad/platform_data_fetcher_win.cc
@@ -8,15 +8,6 @@
#include "content/common/gamepad_messages.h"
#include "content/common/gamepad_hardware_buffer.h"
-#if defined(_WIN32_WINNT_WIN8)
-// The Windows 8 SDK defines FACILITY_VISUALCPP in winerror.h.
-#undef FACILITY_VISUALCPP
-#endif
-#include <delayimp.h>
-
-#pragma comment(lib, "delayimp.lib")
-#pragma comment(lib, "xinput.lib")
-
namespace content {
using namespace WebKit;
@@ -57,37 +48,14 @@ const WebUChar* const GamepadSubTypeName(BYTE sub_type) {
}
}
-// Trap only the exceptions that DELAYLOAD can throw, otherwise rethrow.
-// See http://msdn.microsoft.com/en-us/library/1c9e046h(v=VS.90).aspx.
-LONG WINAPI DelayLoadDllExceptionFilter(PEXCEPTION_POINTERS pExcPointers) {
- LONG disposition = EXCEPTION_EXECUTE_HANDLER;
- switch (pExcPointers->ExceptionRecord->ExceptionCode) {
- case VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND):
- case VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND):
- break;
- default:
- // Exception is not related to delay loading.
- disposition = EXCEPTION_CONTINUE_SEARCH;
- break;
- }
- return disposition;
-}
-
-bool EnableXInput() {
- // We have specified DELAYLOAD for xinput1_3.dll. If the DLL is not
- // installed (XP w/o DirectX redist installed), we disable functionality.
- __try {
- XInputEnable(true);
- } __except(DelayLoadDllExceptionFilter(GetExceptionInformation())) {
- return false;
- }
- return true;
-}
-
} // namespace
GamepadPlatformDataFetcherWin::GamepadPlatformDataFetcherWin()
- : xinput_available_(EnableXInput()) {
+ : xinput_dll_(FilePath(FILE_PATH_LITERAL("xinput1_3.dll"))),
+ xinput_available_(GetXinputDllFunctions()) {
+}
+
+GamepadPlatformDataFetcherWin::~GamepadPlatformDataFetcherWin() {
}
void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads,
@@ -114,7 +82,7 @@ void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads,
WebGamepad& pad = pads->items[i];
TRACE_EVENT1("GAMEPAD", "GetCapabilities", "id", i);
XINPUT_CAPABILITIES caps;
- DWORD res = XInputGetCapabilities(i, XINPUT_FLAG_GAMEPAD, &caps);
+ DWORD res = xinput_get_capabilities_(i, XINPUT_FLAG_GAMEPAD, &caps);
if (res == ERROR_DEVICE_NOT_CONNECTED) {
pad.connected = false;
} else {
@@ -141,7 +109,7 @@ void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads,
XINPUT_STATE state;
memset(&state, 0, sizeof(XINPUT_STATE));
TRACE_EVENT_BEGIN1("GAMEPAD", "XInputGetState", "id", i);
- DWORD dwResult = XInputGetState(i, &state);
+ DWORD dwResult = xinput_get_state_(i, &state);
TRACE_EVENT_END1("GAMEPAD", "XInputGetState", "id", i);
if (dwResult == ERROR_SUCCESS) {
@@ -178,4 +146,21 @@ void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads,
}
}
+bool GamepadPlatformDataFetcherWin::GetXinputDllFunctions() {
+ xinput_enable_ = static_cast<XInputEnableFunc>(
+ xinput_dll_.GetFunctionPointer("XInputEnable"));
+ if (!xinput_enable_)
+ return false;
+ xinput_get_capabilities_ = static_cast<XInputGetCapabilitiesFunc>(
+ xinput_dll_.GetFunctionPointer("XInputGetCapabilities"));
+ if (!xinput_get_capabilities_)
+ return false;
+ xinput_get_state_ = static_cast<XInputGetStateFunc>(
+ xinput_dll_.GetFunctionPointer("XInputGetState"));
+ if (!xinput_get_state_)
+ return false;
+ xinput_enable_(true);
+ return true;
+}
+
} // namespace content
« no previous file with comments | « content/browser/gamepad/platform_data_fetcher_win.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698