2010-11-08 4 views
0

J'ai une classe qui hérite de l'interface IDirectInputA.L'application se bloque lors de la création d'un objet

ici: http://pastebin.com/QuHP02ai

donc, lorsque je tente de créer un objet de ce fait, l'application se bloque (appels CorExitProcess de quelque part). Qu'est-ce que j'ai fait de mal?

p.s. Entrée directe v. 7

p.p.s.

ce code crée un objet. J'ai supprimé du code de celui-ci, à l'exception de la partie principale

IDirectInputA** ppDI; 
HRESULT hr = _DirectInputCreateA(hinst, dwVersion, ppDI, punkOuter); 
xDirectInputA xDI = new xDirectInputA((IDirectInputA*)(*ppDI)); 
+0

Avez-vous alloué de la mémoire pour le pointeur 'm_di'? – Adi

+0

Pouvez-vous fournir un code qui crée une instance xDirectInputA? Que passez-vous dans le constructeur? –

+1

@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. –

Répondre

0

Lorsque vous créez votre exemple, vous passez un pointeur vers IDirectInputA, non? Quel pointeur passez-vous? Si vous passez un pointeur non initialisé ou null, vous obtiendrez un comportement indéfini.

+0

a mis à jour mon message. voir ci-dessus :) Non, il peut être: t null mais je vais le vérifier maintenant à partir du débogueur. – Sasza

+0

Vérifié, ce n'est pas nul. C'est un objet, initialisé par DirectInputCreateA – Sasza

0

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.

Questions connexes