2 * Direct Input ANSI interface wrappers
4 * Copyright 2021 RĂ©mi Bernon for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "device_private.h"
32 #include "dinput_private.h"
34 #include "wine/debug.h"
36 static IDirectInputDeviceImpl
*impl_from_IDirectInputDevice8A( IDirectInputDevice8A
*iface
)
38 return CONTAINING_RECORD( iface
, IDirectInputDeviceImpl
, IDirectInputDevice8A_iface
);
41 static IDirectInputDevice8W
*IDirectInputDevice8W_from_impl( IDirectInputDeviceImpl
*impl
)
43 return &impl
->IDirectInputDevice8W_iface
;
46 static inline IDirectInputDevice8A
*IDirectInputDevice8A_from_IDirectInputDevice8W( IDirectInputDevice8W
*iface
)
48 if (!iface
) return NULL
;
49 return &CONTAINING_RECORD( iface
, IDirectInputDeviceImpl
, IDirectInputDevice8W_iface
)->IDirectInputDevice8A_iface
;
52 static inline IDirectInputDeviceA
*IDirectInputDeviceA_from_IDirectInputDeviceW( IDirectInputDeviceW
*iface
)
54 return (IDirectInputDeviceA
*)IDirectInputDevice8A_from_IDirectInputDevice8W( (IDirectInputDevice8W
*)iface
);
57 static IDirectInputImpl
*impl_from_IDirectInput7A( IDirectInput7A
*iface
)
59 return CONTAINING_RECORD( iface
, IDirectInputImpl
, IDirectInput7A_iface
);
62 static IDirectInput7W
*IDirectInput7W_from_impl( IDirectInputImpl
*impl
)
64 return &impl
->IDirectInput7W_iface
;
67 static IDirectInputImpl
*impl_from_IDirectInput8A( IDirectInput8A
*iface
)
69 return CONTAINING_RECORD( iface
, IDirectInputImpl
, IDirectInput8A_iface
);
72 static IDirectInput8W
*IDirectInput8W_from_impl( IDirectInputImpl
*impl
)
74 return &impl
->IDirectInput8W_iface
;
77 static void dideviceobjectinstance_wtoa( const DIDEVICEOBJECTINSTANCEW
*in
, DIDEVICEOBJECTINSTANCEA
*out
)
79 out
->guidType
= in
->guidType
;
80 out
->dwOfs
= in
->dwOfs
;
81 out
->dwType
= in
->dwType
;
82 out
->dwFlags
= in
->dwFlags
;
83 WideCharToMultiByte( CP_ACP
, 0, in
->tszName
, -1, out
->tszName
, sizeof(out
->tszName
), NULL
, NULL
);
85 if (out
->dwSize
<= FIELD_OFFSET( DIDEVICEOBJECTINSTANCEA
, dwFFMaxForce
)) return;
87 out
->dwFFMaxForce
= in
->dwFFMaxForce
;
88 out
->dwFFForceResolution
= in
->dwFFForceResolution
;
89 out
->wCollectionNumber
= in
->wCollectionNumber
;
90 out
->wDesignatorIndex
= in
->wDesignatorIndex
;
91 out
->wUsagePage
= in
->wUsagePage
;
92 out
->wUsage
= in
->wUsage
;
93 out
->dwDimension
= in
->dwDimension
;
94 out
->wExponent
= in
->wExponent
;
95 out
->wReportId
= in
->wReportId
;
98 static void dideviceinstance_wtoa( const DIDEVICEINSTANCEW
*in
, DIDEVICEINSTANCEA
*out
)
100 out
->guidInstance
= in
->guidInstance
;
101 out
->guidProduct
= in
->guidProduct
;
102 out
->dwDevType
= in
->dwDevType
;
103 WideCharToMultiByte( CP_ACP
, 0, in
->tszInstanceName
, -1, out
->tszInstanceName
,
104 sizeof(out
->tszInstanceName
), NULL
, NULL
);
105 WideCharToMultiByte( CP_ACP
, 0, in
->tszProductName
, -1, out
->tszProductName
,
106 sizeof(out
->tszProductName
), NULL
, NULL
);
108 if (out
->dwSize
<= FIELD_OFFSET( DIDEVICEINSTANCEA
, guidFFDriver
)) return;
110 out
->guidFFDriver
= in
->guidFFDriver
;
111 out
->wUsagePage
= in
->wUsagePage
;
112 out
->wUsage
= in
->wUsage
;
115 static void dieffectinfo_wtoa( const DIEFFECTINFOW
*in
, DIEFFECTINFOA
*out
)
117 out
->guid
= in
->guid
;
118 out
->dwEffType
= in
->dwEffType
;
119 out
->dwStaticParams
= in
->dwStaticParams
;
120 out
->dwDynamicParams
= in
->dwDynamicParams
;
121 WideCharToMultiByte( CP_ACP
, 0, in
->tszName
, -1, out
->tszName
, sizeof(out
->tszName
), NULL
, NULL
);
124 static HRESULT
string_atow( const char *in
, WCHAR
**out
)
129 if (!in
) return DI_OK
;
131 len
= MultiByteToWideChar( CP_ACP
, 0, in
, -1, NULL
, 0 );
132 if (!(*out
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) ))) return DIERR_OUTOFMEMORY
;
134 MultiByteToWideChar( CP_ACP
, 0, in
, -1, *out
, len
);
138 static void diactionformat_wtoa( const DIACTIONFORMATW
*in
, DIACTIONFORMATA
*out
)
142 out
->dwDataSize
= in
->dwDataSize
;
143 out
->dwNumActions
= in
->dwNumActions
;
145 for (i
= 0; i
< in
->dwNumActions
; ++i
)
147 out
->rgoAction
[i
].uAppData
= in
->rgoAction
[i
].uAppData
;
148 out
->rgoAction
[i
].dwSemantic
= in
->rgoAction
[i
].dwSemantic
;
149 out
->rgoAction
[i
].dwFlags
= in
->rgoAction
[i
].dwFlags
;
150 out
->rgoAction
[i
].guidInstance
= in
->rgoAction
[i
].guidInstance
;
151 out
->rgoAction
[i
].dwObjID
= in
->rgoAction
[i
].dwObjID
;
152 out
->rgoAction
[i
].dwHow
= in
->rgoAction
[i
].dwHow
;
153 out
->rgoAction
[i
].lptszActionName
= 0;
156 out
->guidActionMap
= in
->guidActionMap
;
157 out
->dwGenre
= in
->dwGenre
;
158 out
->dwBufferSize
= in
->dwBufferSize
;
159 out
->lAxisMin
= in
->lAxisMin
;
160 out
->lAxisMax
= in
->lAxisMax
;
161 out
->hInstString
= in
->hInstString
;
162 out
->ftTimeStamp
= in
->ftTimeStamp
;
163 out
->dwCRC
= in
->dwCRC
;
165 WideCharToMultiByte( CP_ACP
, 0, in
->tszActionMap
, -1, out
->tszActionMap
,
166 sizeof(out
->tszActionMap
), NULL
, NULL
);
169 static HRESULT
diactionformat_atow( const DIACTIONFORMATA
*in
, DIACTIONFORMATW
*out
, BOOL convert_names
)
174 out
->dwDataSize
= in
->dwDataSize
;
175 out
->dwNumActions
= in
->dwNumActions
;
177 for (i
= 0; i
< out
->dwNumActions
&& SUCCEEDED(hr
); ++i
)
179 out
->rgoAction
[i
].uAppData
= in
->rgoAction
[i
].uAppData
;
180 out
->rgoAction
[i
].dwSemantic
= in
->rgoAction
[i
].dwSemantic
;
181 out
->rgoAction
[i
].dwFlags
= in
->rgoAction
[i
].dwFlags
;
182 out
->rgoAction
[i
].guidInstance
= in
->rgoAction
[i
].guidInstance
;
183 out
->rgoAction
[i
].dwObjID
= in
->rgoAction
[i
].dwObjID
;
184 out
->rgoAction
[i
].dwHow
= in
->rgoAction
[i
].dwHow
;
185 if (!convert_names
) out
->rgoAction
[i
].lptszActionName
= 0;
186 else if (in
->hInstString
) out
->rgoAction
[i
].uResIdString
= in
->rgoAction
[i
].uResIdString
;
187 else hr
= string_atow( in
->rgoAction
[i
].lptszActionName
, (WCHAR
**)&out
->rgoAction
[i
].lptszActionName
);
190 for (; i
< out
->dwNumActions
; ++i
) out
->rgoAction
[i
].lptszActionName
= 0;
192 out
->guidActionMap
= in
->guidActionMap
;
193 out
->dwGenre
= in
->dwGenre
;
194 out
->dwBufferSize
= in
->dwBufferSize
;
195 out
->lAxisMin
= in
->lAxisMin
;
196 out
->lAxisMax
= in
->lAxisMax
;
197 out
->hInstString
= in
->hInstString
;
198 out
->ftTimeStamp
= in
->ftTimeStamp
;
199 out
->dwCRC
= in
->dwCRC
;
201 MultiByteToWideChar( CP_ACP
, 0, in
->tszActionMap
, -1, out
->tszActionMap
,
202 sizeof(out
->tszActionMap
) / sizeof(WCHAR
) );
207 static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW
*in
, DIDEVICEIMAGEINFOA
*out
)
209 WideCharToMultiByte( CP_ACP
, 0, in
->tszImagePath
, -1, out
->tszImagePath
,
210 sizeof(out
->tszImagePath
), NULL
, NULL
);
212 out
->dwFlags
= in
->dwFlags
;
213 out
->dwViewID
= in
->dwViewID
;
214 out
->rcOverlay
= in
->rcOverlay
;
215 out
->dwObjID
= in
->dwObjID
;
216 out
->dwcValidPts
= in
->dwcValidPts
;
217 out
->rgptCalloutLine
[0] = in
->rgptCalloutLine
[0];
218 out
->rgptCalloutLine
[1] = in
->rgptCalloutLine
[1];
219 out
->rgptCalloutLine
[2] = in
->rgptCalloutLine
[2];
220 out
->rgptCalloutLine
[3] = in
->rgptCalloutLine
[3];
221 out
->rgptCalloutLine
[4] = in
->rgptCalloutLine
[4];
222 out
->rcCalloutRect
= in
->rcCalloutRect
;
223 out
->dwTextAlign
= in
->dwTextAlign
;
226 static void dideviceimageinfoheader_wtoa( const DIDEVICEIMAGEINFOHEADERW
*in
, DIDEVICEIMAGEINFOHEADERA
*out
)
230 out
->dwcViews
= in
->dwcViews
;
231 out
->dwcButtons
= in
->dwcButtons
;
232 out
->dwcAxes
= in
->dwcAxes
;
233 out
->dwcPOVs
= in
->dwcPOVs
;
234 out
->dwBufferUsed
= 0;
236 for (i
= 0; i
< in
->dwBufferUsed
/ sizeof(DIDEVICEIMAGEINFOW
); ++i
)
238 dideviceimageinfo_wtoa( &in
->lprgImageInfoArray
[i
], &out
->lprgImageInfoArray
[i
] );
239 out
->dwBufferUsed
+= sizeof(DIDEVICEIMAGEINFOA
);
243 static HRESULT
diconfiguredevicesparams_atow( const DICONFIGUREDEVICESPARAMSA
*in
, DICONFIGUREDEVICESPARAMSW
*out
)
245 const char *name_a
= in
->lptszUserNames
;
248 if (!in
->lptszUserNames
) out
->lptszUserNames
= NULL
;
251 while (name_a
[0] && name_a
[1]) ++name_a
;
252 len_a
= name_a
- in
->lptszUserNames
+ 1;
253 len_w
= MultiByteToWideChar( CP_ACP
, 0, in
->lptszUserNames
, len_a
, NULL
, 0 );
255 out
->lptszUserNames
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, len_w
* sizeof(WCHAR
) );
256 if (!out
->lptszUserNames
) return DIERR_OUTOFMEMORY
;
258 MultiByteToWideChar( CP_ACP
, 0, in
->lptszUserNames
, len_a
, out
->lptszUserNames
, len_w
);
261 out
->dwcUsers
= in
->dwcUsers
;
262 out
->dwcFormats
= in
->dwcFormats
;
263 out
->hwnd
= in
->hwnd
;
264 out
->dics
= in
->dics
;
265 out
->lpUnkDDSTarget
= in
->lpUnkDDSTarget
;
270 static HRESULT WINAPI
dinput_device_a_QueryInterface( IDirectInputDevice8A
*iface_a
, REFIID iid
, void **out
)
272 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
273 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
274 return IDirectInputDevice8_QueryInterface( iface_w
, iid
, out
);
277 static ULONG WINAPI
dinput_device_a_AddRef( IDirectInputDevice8A
*iface_a
)
279 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
280 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
281 return IDirectInputDevice8_AddRef( iface_w
);
284 static ULONG WINAPI
dinput_device_a_Release( IDirectInputDevice8A
*iface_a
)
286 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
287 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
288 return IDirectInputDevice8_Release( iface_w
);
291 static HRESULT WINAPI
dinput_device_a_GetCapabilities( IDirectInputDevice8A
*iface_a
, DIDEVCAPS
*caps
)
293 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
294 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
295 return IDirectInputDevice8_GetCapabilities( iface_w
, caps
);
298 struct enum_objects_wtoa_params
300 LPDIENUMDEVICEOBJECTSCALLBACKA callback
;
304 static BOOL CALLBACK
enum_objects_wtoa_callback( const DIDEVICEOBJECTINSTANCEW
*instance_w
, void *ref
)
306 struct enum_objects_wtoa_params
*params
= ref
;
307 DIDEVICEOBJECTINSTANCEA instance_a
= {sizeof(instance_a
)};
309 dideviceobjectinstance_wtoa( instance_w
, &instance_a
);
310 return params
->callback( &instance_a
, params
->ref
);
313 static HRESULT WINAPI
dinput_device_a_EnumObjects( IDirectInputDevice8A
*iface_a
, LPDIENUMDEVICEOBJECTSCALLBACKA callback
,
314 void *ref
, DWORD flags
)
316 struct enum_objects_wtoa_params params
= {callback
, ref
};
317 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
318 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
320 if (!callback
) return DIERR_INVALIDPARAM
;
322 return IDirectInputDevice8_EnumObjects( iface_w
, enum_objects_wtoa_callback
, ¶ms
, flags
);
325 static HRESULT WINAPI
dinput_device_a_GetProperty( IDirectInputDevice8A
*iface_a
, REFGUID guid
, DIPROPHEADER
*header
)
327 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
328 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
329 return IDirectInputDevice8_GetProperty( iface_w
, guid
, header
);
332 static HRESULT WINAPI
dinput_device_a_SetProperty( IDirectInputDevice8A
*iface_a
, REFGUID guid
, const DIPROPHEADER
*header
)
334 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
335 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
336 return IDirectInputDevice8_SetProperty( iface_w
, guid
, header
);
339 static HRESULT WINAPI
dinput_device_a_Acquire( IDirectInputDevice8A
*iface_a
)
341 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
342 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
343 return IDirectInputDevice8_Acquire( iface_w
);
346 static HRESULT WINAPI
dinput_device_a_Unacquire( IDirectInputDevice8A
*iface_a
)
348 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
349 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
350 return IDirectInputDevice8_Unacquire( iface_w
);
353 static HRESULT WINAPI
dinput_device_a_GetDeviceState( IDirectInputDevice8A
*iface_a
, DWORD count
, void *data
)
355 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
356 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
357 return IDirectInputDevice8_GetDeviceState( iface_w
, count
, data
);
360 static HRESULT WINAPI
dinput_device_a_GetDeviceData( IDirectInputDevice8A
*iface_a
, DWORD data_size
, DIDEVICEOBJECTDATA
*data
,
361 DWORD
*entries
, DWORD flags
)
363 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
364 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
365 return IDirectInputDevice8_GetDeviceData( iface_w
, data_size
, data
, entries
, flags
);
368 static HRESULT WINAPI
dinput_device_a_SetDataFormat( IDirectInputDevice8A
*iface_a
, const DIDATAFORMAT
*format
)
370 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
371 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
372 return IDirectInputDevice8_SetDataFormat( iface_w
, format
);
375 static HRESULT WINAPI
dinput_device_a_SetEventNotification( IDirectInputDevice8A
*iface_a
, HANDLE event
)
377 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
378 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
379 return IDirectInputDevice8_SetEventNotification( iface_w
, event
);
382 static HRESULT WINAPI
dinput_device_a_SetCooperativeLevel( IDirectInputDevice8A
*iface_a
, HWND window
, DWORD flags
)
384 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
385 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
386 return IDirectInputDevice8_SetCooperativeLevel( iface_w
, window
, flags
);
389 static HRESULT WINAPI
dinput_device_a_GetObjectInfo( IDirectInputDevice8A
*iface_a
, DIDEVICEOBJECTINSTANCEA
*instance_a
,
390 DWORD obj
, DWORD how
)
392 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
393 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
394 DIDEVICEOBJECTINSTANCEW instance_w
= {sizeof(instance_w
)};
397 if (!instance_a
) return E_POINTER
;
398 if (instance_a
->dwSize
!= sizeof(DIDEVICEOBJECTINSTANCEA
) &&
399 instance_a
->dwSize
!= sizeof(DIDEVICEOBJECTINSTANCE_DX3A
))
400 return DIERR_INVALIDPARAM
;
402 hr
= IDirectInputDevice8_GetObjectInfo( iface_w
, &instance_w
, obj
, how
);
403 dideviceobjectinstance_wtoa( &instance_w
, instance_a
);
408 static HRESULT WINAPI
dinput_device_a_GetDeviceInfo( IDirectInputDevice8A
*iface_a
, DIDEVICEINSTANCEA
*instance_a
)
410 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
411 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
412 DIDEVICEINSTANCEW instance_w
= {sizeof(instance_w
)};
415 if (!instance_a
) return E_POINTER
;
416 if (instance_a
->dwSize
!= sizeof(DIDEVICEINSTANCEA
) && instance_a
->dwSize
!= sizeof(DIDEVICEINSTANCE_DX3A
))
417 return DIERR_INVALIDPARAM
;
419 hr
= IDirectInputDevice8_GetDeviceInfo( iface_w
, &instance_w
);
420 dideviceinstance_wtoa( &instance_w
, instance_a
);
425 static HRESULT WINAPI
dinput_device_a_RunControlPanel( IDirectInputDevice8A
*iface_a
, HWND owner
, DWORD flags
)
427 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
428 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
429 return IDirectInputDevice8_RunControlPanel( iface_w
, owner
, flags
);
432 static HRESULT WINAPI
dinput_device_a_Initialize( IDirectInputDevice8A
*iface_a
, HINSTANCE instance
, DWORD version
, REFGUID guid
)
434 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
435 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
436 return IDirectInputDevice8_Initialize( iface_w
, instance
, version
, guid
);
439 static HRESULT WINAPI
dinput_device_a_CreateEffect( IDirectInputDevice8A
*iface_a
, REFGUID guid
, const DIEFFECT
*effect
,
440 IDirectInputEffect
**out
, IUnknown
*outer
)
442 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
443 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
444 return IDirectInputDevice8_CreateEffect( iface_w
, guid
, effect
, out
, outer
);
447 struct enum_effects_wtoa_params
449 LPDIENUMEFFECTSCALLBACKA callback
;
453 static BOOL CALLBACK
enum_effects_wtoa_callback( const DIEFFECTINFOW
*info_w
, void *ref
)
455 struct enum_effects_wtoa_params
*params
= ref
;
456 DIEFFECTINFOA info_a
= {sizeof(info_a
)};
458 dieffectinfo_wtoa( info_w
, &info_a
);
459 return params
->callback( &info_a
, params
->ref
);
462 static HRESULT WINAPI
dinput_device_a_EnumEffects( IDirectInputDevice8A
*iface_a
, LPDIENUMEFFECTSCALLBACKA callback
,
463 void *ref
, DWORD type
)
465 struct enum_effects_wtoa_params params
= {callback
, ref
};
466 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
467 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
469 if (!callback
) return DIERR_INVALIDPARAM
;
471 return IDirectInputDevice8_EnumEffects( iface_w
, enum_effects_wtoa_callback
, ¶ms
, type
);
474 static HRESULT WINAPI
dinput_device_a_GetEffectInfo( IDirectInputDevice8A
*iface_a
, DIEFFECTINFOA
*info_a
, REFGUID guid
)
476 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
477 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
478 DIEFFECTINFOW info_w
= {sizeof(info_w
)};
481 if (!info_a
) return E_POINTER
;
482 if (info_a
->dwSize
!= sizeof(DIEFFECTINFOA
)) return DIERR_INVALIDPARAM
;
484 hr
= IDirectInputDevice8_GetEffectInfo( iface_w
, &info_w
, guid
);
485 dieffectinfo_wtoa( &info_w
, info_a
);
490 static HRESULT WINAPI
dinput_device_a_GetForceFeedbackState( IDirectInputDevice8A
*iface_a
, DWORD
*state
)
492 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
493 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
494 return IDirectInputDevice8_GetForceFeedbackState( iface_w
, state
);
497 static HRESULT WINAPI
dinput_device_a_SendForceFeedbackCommand( IDirectInputDevice8A
*iface_a
, DWORD flags
)
499 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
500 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
501 return IDirectInputDevice8_SendForceFeedbackCommand( iface_w
, flags
);
504 static HRESULT WINAPI
dinput_device_a_EnumCreatedEffectObjects( IDirectInputDevice8A
*iface_a
, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback
,
505 void *ref
, DWORD flags
)
507 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
508 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
509 return IDirectInputDevice8_EnumCreatedEffectObjects( iface_w
, callback
, ref
, flags
);
512 static HRESULT WINAPI
dinput_device_a_Escape( IDirectInputDevice8A
*iface_a
, DIEFFESCAPE
*escape
)
514 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
515 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
516 return IDirectInputDevice8_Escape( iface_w
, escape
);
519 static HRESULT WINAPI
dinput_device_a_Poll( IDirectInputDevice8A
*iface_a
)
521 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
522 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
523 return IDirectInputDevice8_Poll( iface_w
);
526 static HRESULT WINAPI
dinput_device_a_SendDeviceData( IDirectInputDevice8A
*iface_a
, DWORD count
, const DIDEVICEOBJECTDATA
*data
,
527 DWORD
*inout
, DWORD flags
)
529 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
530 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
531 return IDirectInputDevice8_SendDeviceData( iface_w
, count
, data
, inout
, flags
);
534 static HRESULT WINAPI
dinput_device_a_EnumEffectsInFile( IDirectInputDevice8A
*iface_a
, const char *filename_a
, LPDIENUMEFFECTSINFILECALLBACK callback
,
535 void *ref
, DWORD flags
)
537 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
538 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
539 WCHAR buffer
[MAX_PATH
], *filename_w
= buffer
;
541 if (!filename_a
) filename_w
= NULL
;
542 else MultiByteToWideChar( CP_ACP
, 0, filename_a
, -1, buffer
, MAX_PATH
);
544 return IDirectInputDevice8_EnumEffectsInFile( iface_w
, filename_w
, callback
, ref
, flags
);
547 static HRESULT WINAPI
dinput_device_a_WriteEffectToFile( IDirectInputDevice8A
*iface_a
, const char *filename_a
, DWORD entries
,
548 DIFILEEFFECT
*file_effect
, DWORD flags
)
550 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
551 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
552 WCHAR buffer
[MAX_PATH
], *filename_w
= buffer
;
554 if (!filename_a
) filename_w
= NULL
;
555 else MultiByteToWideChar( CP_ACP
, 0, filename_a
, -1, buffer
, MAX_PATH
);
557 return IDirectInputDevice8_WriteEffectToFile( iface_w
, filename_w
, entries
, file_effect
, flags
);
560 static HRESULT WINAPI
dinput_device_a_BuildActionMap( IDirectInputDevice8A
*iface_a
, DIACTIONFORMATA
*format_a
,
561 const char *username_a
, DWORD flags
)
563 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
564 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
565 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
569 if (!format_a
) return E_POINTER
;
570 if (format_a
->dwSize
!= sizeof(DIACTIONFORMATA
)) return DIERR_INVALIDPARAM
;
571 if (format_a
->dwActionSize
!= sizeof(DIACTIONA
)) return DIERR_INVALIDPARAM
;
572 if (FAILED(hr
= string_atow( username_a
, &username_w
))) return hr
;
574 format_w
.dwNumActions
= format_a
->dwNumActions
;
575 format_w
.rgoAction
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, format_a
->dwNumActions
* sizeof(DIACTIONW
) );
576 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
579 diactionformat_atow( format_a
, &format_w
, FALSE
);
580 hr
= IDirectInputDevice8_BuildActionMap( iface_w
, &format_w
, username_w
, flags
);
581 diactionformat_wtoa( &format_w
, format_a
);
582 HeapFree( GetProcessHeap(), 0, format_w
.rgoAction
);
585 HeapFree( GetProcessHeap(), 0, username_w
);
589 static HRESULT WINAPI
dinput_device_a_SetActionMap( IDirectInputDevice8A
*iface_a
, DIACTIONFORMATA
*format_a
,
590 const char *username_a
, DWORD flags
)
592 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
593 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
594 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
598 if (!format_a
) return E_POINTER
;
599 if (format_a
->dwSize
!= sizeof(DIACTIONFORMATA
)) return DIERR_INVALIDPARAM
;
600 if (format_a
->dwActionSize
!= sizeof(DIACTIONA
)) return DIERR_INVALIDPARAM
;
601 if (FAILED(hr
= string_atow( username_a
, &username_w
))) return hr
;
603 format_w
.dwNumActions
= format_a
->dwNumActions
;
604 format_w
.rgoAction
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, format_a
->dwNumActions
* sizeof(DIACTIONW
) );
605 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
608 diactionformat_atow( format_a
, &format_w
, FALSE
);
609 hr
= IDirectInputDevice8_SetActionMap( iface_w
, &format_w
, username_w
, flags
);
610 diactionformat_wtoa( &format_w
, format_a
);
611 HeapFree( GetProcessHeap(), 0, format_w
.rgoAction
);
614 HeapFree( GetProcessHeap(), 0, username_w
);
618 static HRESULT WINAPI
dinput_device_a_GetImageInfo( IDirectInputDevice8A
*iface_a
, DIDEVICEIMAGEINFOHEADERA
*header_a
)
620 IDirectInputDeviceImpl
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
621 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
622 DIDEVICEIMAGEINFOHEADERW header_w
= {sizeof(header_w
), sizeof(DIDEVICEIMAGEINFOW
)};
625 if (!header_a
) return E_POINTER
;
626 if (header_a
->dwSize
!= sizeof(DIDEVICEIMAGEINFOHEADERA
)) return DIERR_INVALIDPARAM
;
627 if (header_a
->dwSizeImageInfo
!= sizeof(DIDEVICEIMAGEINFOA
)) return DIERR_INVALIDPARAM
;
629 header_w
.dwBufferSize
= (header_a
->dwBufferSize
/ sizeof(DIDEVICEIMAGEINFOA
)) * sizeof(DIDEVICEIMAGEINFOW
);
630 header_w
.lprgImageInfoArray
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, header_w
.dwBufferSize
);
631 if (!header_w
.lprgImageInfoArray
) return DIERR_OUTOFMEMORY
;
633 hr
= IDirectInputDevice8_GetImageInfo( iface_w
, &header_w
);
634 dideviceimageinfoheader_wtoa( &header_w
, header_a
);
635 HeapFree( GetProcessHeap(), 0, header_w
.lprgImageInfoArray
);
639 const IDirectInputDevice8AVtbl dinput_device_a_vtbl
=
641 /*** IUnknown methods ***/
642 dinput_device_a_QueryInterface
,
643 dinput_device_a_AddRef
,
644 dinput_device_a_Release
,
645 /*** IDirectInputDeviceA methods ***/
646 dinput_device_a_GetCapabilities
,
647 dinput_device_a_EnumObjects
,
648 dinput_device_a_GetProperty
,
649 dinput_device_a_SetProperty
,
650 dinput_device_a_Acquire
,
651 dinput_device_a_Unacquire
,
652 dinput_device_a_GetDeviceState
,
653 dinput_device_a_GetDeviceData
,
654 dinput_device_a_SetDataFormat
,
655 dinput_device_a_SetEventNotification
,
656 dinput_device_a_SetCooperativeLevel
,
657 dinput_device_a_GetObjectInfo
,
658 dinput_device_a_GetDeviceInfo
,
659 dinput_device_a_RunControlPanel
,
660 dinput_device_a_Initialize
,
661 /*** IDirectInputDevice2A methods ***/
662 dinput_device_a_CreateEffect
,
663 dinput_device_a_EnumEffects
,
664 dinput_device_a_GetEffectInfo
,
665 dinput_device_a_GetForceFeedbackState
,
666 dinput_device_a_SendForceFeedbackCommand
,
667 dinput_device_a_EnumCreatedEffectObjects
,
668 dinput_device_a_Escape
,
669 dinput_device_a_Poll
,
670 dinput_device_a_SendDeviceData
,
671 /*** IDirectInputDevice7A methods ***/
672 dinput_device_a_EnumEffectsInFile
,
673 dinput_device_a_WriteEffectToFile
,
674 /*** IDirectInputDevice8A methods ***/
675 dinput_device_a_BuildActionMap
,
676 dinput_device_a_SetActionMap
,
677 dinput_device_a_GetImageInfo
,
680 static HRESULT WINAPI
dinput8_a_QueryInterface( IDirectInput8A
*iface_a
, REFIID iid
, void **out
)
682 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
683 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
684 return IDirectInput8_QueryInterface( iface_w
, iid
, out
);
687 static ULONG WINAPI
dinput8_a_AddRef( IDirectInput8A
*iface_a
)
689 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
690 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
691 return IDirectInput8_AddRef( iface_w
);
694 static ULONG WINAPI
dinput8_a_Release( IDirectInput8A
*iface_a
)
696 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
697 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
698 return IDirectInput8_Release( iface_w
);
701 static HRESULT WINAPI
dinput8_a_CreateDevice( IDirectInput8A
*iface_a
, REFGUID guid
, IDirectInputDevice8A
**out
, IUnknown
*outer
)
703 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
704 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
705 IDirectInputDevice8W
*outw
;
708 if (!out
) return E_POINTER
;
710 hr
= IDirectInput8_CreateDevice( iface_w
, guid
, &outw
, outer
);
711 *out
= IDirectInputDevice8A_from_IDirectInputDevice8W( outw
);
715 struct enum_devices_wtoa_params
717 LPDIENUMDEVICESCALLBACKA callback
;
721 static BOOL CALLBACK
enum_devices_wtoa_callback( const DIDEVICEINSTANCEW
*instance_w
, void *data
)
723 struct enum_devices_wtoa_params
*params
= data
;
724 DIDEVICEINSTANCEA instance_a
= {sizeof(instance_a
)};
726 dideviceinstance_wtoa( instance_w
, &instance_a
);
727 return params
->callback( &instance_a
, params
->ref
);
730 static HRESULT WINAPI
dinput8_a_EnumDevices( IDirectInput8A
*iface_a
, DWORD type
, LPDIENUMDEVICESCALLBACKA callback
,
731 void *ref
, DWORD flags
)
733 struct enum_devices_wtoa_params params
= {callback
, ref
};
734 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
735 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
737 if (!callback
) return DIERR_INVALIDPARAM
;
739 return IDirectInput8_EnumDevices( iface_w
, type
, enum_devices_wtoa_callback
, ¶ms
, flags
);
742 static HRESULT WINAPI
dinput8_a_GetDeviceStatus( IDirectInput8A
*iface_a
, REFGUID instance_guid
)
744 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
745 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
746 return IDirectInput8_GetDeviceStatus( iface_w
, instance_guid
);
749 static HRESULT WINAPI
dinput8_a_RunControlPanel( IDirectInput8A
*iface_a
, HWND owner
, DWORD flags
)
751 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
752 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
753 return IDirectInput8_RunControlPanel( iface_w
, owner
, flags
);
756 static HRESULT WINAPI
dinput8_a_Initialize( IDirectInput8A
*iface_a
, HINSTANCE instance
, DWORD version
)
758 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
759 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
760 return IDirectInput8_Initialize( iface_w
, instance
, version
);
763 static HRESULT WINAPI
dinput8_a_FindDevice( IDirectInput8A
*iface_a
, REFGUID guid
, const char *name_a
, GUID
*instance_guid
)
765 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
766 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
770 if (FAILED(hr
= string_atow( name_a
, &name_w
))) return hr
;
772 hr
= IDirectInput8_FindDevice( iface_w
, guid
, name_w
, instance_guid
);
773 HeapFree( GetProcessHeap(), 0, name_w
);
777 struct enum_devices_by_semantics_wtoa_params
779 LPDIENUMDEVICESBYSEMANTICSCBA callback
;
783 static BOOL CALLBACK
enum_devices_by_semantics_wtoa_callback( const DIDEVICEINSTANCEW
*instance_w
, IDirectInputDevice8W
*iface_w
,
784 DWORD flags
, DWORD remaining
, void *data
)
786 struct enum_devices_by_semantics_wtoa_params
*params
= data
;
787 IDirectInputDevice8A
*iface_a
= IDirectInputDevice8A_from_IDirectInputDevice8W( iface_w
);
788 DIDEVICEINSTANCEA instance_a
= {sizeof(instance_a
)};
790 dideviceinstance_wtoa( instance_w
, &instance_a
);
791 return params
->callback( &instance_a
, iface_a
, flags
, remaining
, params
->ref
);
794 static HRESULT WINAPI
dinput8_a_EnumDevicesBySemantics( IDirectInput8A
*iface_a
, const char *username_a
, DIACTIONFORMATA
*format_a
,
795 LPDIENUMDEVICESBYSEMANTICSCBA callback
, void *ref
, DWORD flags
)
797 struct enum_devices_by_semantics_wtoa_params params
= {callback
, ref
};
798 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
799 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
800 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
804 if (!callback
) return DIERR_INVALIDPARAM
;
805 if (FAILED(hr
= string_atow( username_a
, &username_w
))) return hr
;
807 format_w
.dwNumActions
= format_a
->dwNumActions
;
808 format_w
.rgoAction
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, format_a
->dwNumActions
* sizeof(DIACTIONW
) );
809 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
812 diactionformat_atow( format_a
, &format_w
, FALSE
);
813 hr
= IDirectInput8_EnumDevicesBySemantics( iface_w
, username_w
, &format_w
, enum_devices_by_semantics_wtoa_callback
,
815 HeapFree( GetProcessHeap(), 0, format_w
.rgoAction
);
818 HeapFree( GetProcessHeap(), 0, username_w
);
822 static HRESULT WINAPI
dinput8_a_ConfigureDevices( IDirectInput8A
*iface_a
, LPDICONFIGUREDEVICESCALLBACK callback
,
823 DICONFIGUREDEVICESPARAMSA
*params_a
, DWORD flags
, void *ref
)
825 IDirectInputImpl
*impl
= impl_from_IDirectInput8A( iface_a
);
826 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
827 DICONFIGUREDEVICESPARAMSW params_w
= {sizeof(params_w
)};
828 DIACTIONFORMATA
*format_a
= params_a
->lprgFormats
;
829 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
833 if (!callback
) return DIERR_INVALIDPARAM
;
834 if (FAILED(hr
= diconfiguredevicesparams_atow( params_a
, ¶ms_w
))) return hr
;
836 format_w
.dwNumActions
= format_a
->dwNumActions
;
837 format_w
.rgoAction
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, format_a
->dwNumActions
* sizeof(DIACTIONW
) );
838 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
841 hr
= diactionformat_atow( format_a
, &format_w
, TRUE
);
842 params_w
.lprgFormats
= &format_w
;
844 if (SUCCEEDED(hr
)) hr
= IDirectInput8_ConfigureDevices( iface_w
, callback
, ¶ms_w
, flags
, ref
);
846 if (!format_w
.hInstString
) for (i
= 0; i
< format_w
.dwNumActions
; ++i
) HeapFree( GetProcessHeap(), 0, (void *)format_w
.rgoAction
[i
].lptszActionName
);
847 HeapFree( GetProcessHeap(), 0, format_w
.rgoAction
);
850 HeapFree( GetProcessHeap(), 0, params_w
.lptszUserNames
);
854 const IDirectInput8AVtbl dinput8_a_vtbl
=
856 /*** IUnknown methods ***/
857 dinput8_a_QueryInterface
,
860 /*** IDirectInput8A methods ***/
861 dinput8_a_CreateDevice
,
862 dinput8_a_EnumDevices
,
863 dinput8_a_GetDeviceStatus
,
864 dinput8_a_RunControlPanel
,
865 dinput8_a_Initialize
,
866 dinput8_a_FindDevice
,
867 dinput8_a_EnumDevicesBySemantics
,
868 dinput8_a_ConfigureDevices
,
871 static HRESULT WINAPI
dinput7_a_QueryInterface( IDirectInput7A
*iface_a
, REFIID iid
, void **out
)
873 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
874 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
875 return IDirectInput7_QueryInterface( iface_w
, iid
, out
);
878 static ULONG WINAPI
dinput7_a_AddRef( IDirectInput7A
*iface_a
)
880 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
881 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
882 return IDirectInput7_AddRef( iface_w
);
885 static ULONG WINAPI
dinput7_a_Release( IDirectInput7A
*iface_a
)
887 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
888 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
889 return IDirectInput7_Release( iface_w
);
892 static HRESULT WINAPI
dinput7_a_CreateDevice( IDirectInput7A
*iface_a
, REFGUID guid
, IDirectInputDeviceA
**out_a
, IUnknown
*outer
)
894 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
895 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
896 IDirectInputDeviceW
*out_w
;
899 if (!out_a
) return E_POINTER
;
901 hr
= IDirectInput7_CreateDevice( iface_w
, guid
, &out_w
, outer
);
902 *out_a
= IDirectInputDeviceA_from_IDirectInputDeviceW( out_w
);
906 static HRESULT WINAPI
dinput7_a_EnumDevices( IDirectInput7A
*iface_a
, DWORD type
, LPDIENUMDEVICESCALLBACKA callback
,
907 void *ref
, DWORD flags
)
909 struct enum_devices_wtoa_params params
= {callback
, ref
};
910 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
911 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
913 if (!callback
) return DIERR_INVALIDPARAM
;
915 return IDirectInput7_EnumDevices( iface_w
, type
, enum_devices_wtoa_callback
, ¶ms
, flags
);
918 static HRESULT WINAPI
dinput7_a_GetDeviceStatus( IDirectInput7A
*iface_a
, REFGUID instance_guid
)
920 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
921 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
922 return IDirectInput7_GetDeviceStatus( iface_w
, instance_guid
);
925 static HRESULT WINAPI
dinput7_a_RunControlPanel( IDirectInput7A
*iface_a
, HWND owner
, DWORD flags
)
927 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
928 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
929 return IDirectInput7_RunControlPanel( iface_w
, owner
, flags
);
932 static HRESULT WINAPI
dinput7_a_Initialize( IDirectInput7A
*iface_a
, HINSTANCE instance
, DWORD version
)
934 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
935 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
936 return IDirectInput7_Initialize( iface_w
, instance
, version
);
939 static HRESULT WINAPI
dinput7_a_FindDevice( IDirectInput7A
*iface_a
, REFGUID guid
, const char *name_a
, GUID
*instance_guid
)
941 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
942 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
946 if (FAILED(hr
= string_atow( name_a
, &name_w
))) return hr
;
948 hr
= IDirectInput7_FindDevice( iface_w
, guid
, name_w
, instance_guid
);
949 HeapFree( GetProcessHeap(), 0, name_w
);
953 static HRESULT WINAPI
dinput7_a_CreateDeviceEx( IDirectInput7A
*iface_a
, REFGUID guid
, REFIID iid
, void **out
, IUnknown
*outer
)
955 IDirectInputImpl
*impl
= impl_from_IDirectInput7A( iface_a
);
956 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
957 return IDirectInput7_CreateDeviceEx( iface_w
, guid
, iid
, out
, outer
);
960 const IDirectInput7AVtbl dinput7_a_vtbl
=
962 /*** IUnknown methods ***/
963 dinput7_a_QueryInterface
,
966 /*** IDirectInputA methods ***/
967 dinput7_a_CreateDevice
,
968 dinput7_a_EnumDevices
,
969 dinput7_a_GetDeviceStatus
,
970 dinput7_a_RunControlPanel
,
971 dinput7_a_Initialize
,
972 /*** IDirectInput2A methods ***/
973 dinput7_a_FindDevice
,
974 /*** IDirectInput7A methods ***/
975 dinput7_a_CreateDeviceEx
,