TBH ce que vous essayez de faire est plus compliqué que vous ne le pensez. Le problème se pose dans ce que vous essayez de faire exactement. Essayez-vous d'intégrer IDirectInputA ou essayez-vous de le ré-implémenter complètement?
Si vous essayez de l'envelopper procédez comme suit:
IDirectInputA* pDI = NULL;
HRESULT hr = _DirectInputCreateA(hinst, dwVersion, &pDI, NULL);
Ensuite, créez votre classe dérivée comme suit:
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.
};
Maintenant, vous passez votre pointeur de xDirectInputA autour de la place du pointeur normale retournée de DirectInputCreate. Vous pouvez maintenant intercepter tous les messages qui traversent la classe.
Si vous essayez de faire votre propre ré-implémentation complète, c'est BEAUCOUP plus compliqué. Vous allez avoir besoin d'implémenter complètement l'objet COM. Il vaudra mieux mettre un DInput.DLL à côté de l'exécutable qui contient votre implémentation. Bien que ce soit seulement quelque chose que vous devriez essayer si vous savez vraiment ce que vous faites.
Si vous souhaitez apprendre COM entièrement, je suggère d'acheter Essential COM par Don Box. C'est un livre très utile.
Avez-vous alloué de la mémoire pour le pointeur 'm_di'? – Adi
Pouvez-vous fournir un code qui crée une instance xDirectInputA? Que passez-vous dans le constructeur? –
@Sasza: S'il vous plaît ne pas poster des liens vers le code, mais plutôt le code réel. Essayez d'afficher la partie * minimale * de votre code source qui pourrait nous donner une idée de ce qui ne va pas. –