ТБХ то, что вы пытаетесь сделать, сложнее, чем вы думаете.Проблема возникает в том, что именно вы пытаетесь сделать.Пытаетесь ли вы обернуть IDirectInputA ИЛИ вы пытаетесь полностью повторно реализовать его.
Если вы пытаетесь обернуть его, сделайте следующее:
IDirectInputA* pDI = NULL;
HRESULT hr = _DirectInputCreateA( hinst, dwVersion, &pDI, NULL );
Затем создайте производный класс следующим образом:
class xDirectInputA : public IDirectInputA
{
protected:
IDirectInputA* mpInternal;
public:
xDirectInputA( IDirectInputA* pInternal ) :
mpInternal( pInternal )
HRESULT CreateDevice( REFGUID rguid, IDirectInputDevice** ppDirectInputDevice, IUknown* pOuter )
{
// Do what ever processing you need.
return mpInternal->CreateDevice( rguid, ppDirectInputDevice, pOuter );
}
// Implement other functions.
};
Теперь вы передаете указатель xDirectInputA вместо обычного указателя, возвращенного из DirectInputCreate.Теперь вы можете перехватывать каждое сообщение, проходящее через класс.
Если вы пытаетесь выполнить собственную полную повторную реализацию, это намного сложнее.Вам нужно полностью реализовать объект COM.Лучше всего поместить DInput.DLL вместе с исполняемым файлом, содержащим вашу реализацию.В общем, это только то, что вы должны попробовать, если ДЕЙСТВИТЕЛЬНО знаете, что делаете.
Если вы хотите полностью изучить COM, я предлагаю приобрести Essential COM от Don Box.Это ОЧЕНЬ полезная книга.