2010-03-31 7 views
1

j'ai dll et C++ natif deux classes:passant interfaces en tant que paramètres dans ATL

classA 
{ 
void setNumber(int number); 
int getNumber(); 
} 
classB 
{ 
void setclassA(classA*); 
classA* getclassA(); 
} 

j'ai une DLL ATL qui enveloppe le C++ natif dll et deux interfaces: InterfaceForClassA, InterfaceForClassB.

InterfaceForClassA:

STDMETHODIMP CInterfaceForClassA::createClassAObject(void) 
{ 
     ClassA* Aobject = new ClassA(); 
     return S_OK; 
} 
STDMETHODIMP CInterfaceForClassA::setNumberInClassA(SHORT pVal) 
{  
    if(Aobject != NULL) 
     Aobject->setNumber(pVal); 
    return S_OK; 
} 
STDMETHODIMP CInterfaceForClassA::getNumberInClassA(SHORT* pVal) 
{  
     if(Aobject != NULL) 
      *pVal = Aobject->getNumber(); 
     return S_OK; 
} 

InterfaceForClassB:

IInterfaceForClassA* clsAInterface; 
STDMETHODIMP CInterfaceForClassB::setClassA(IInterfaceForClassA * val) 
{ 
    val->QueryInterface(IID_IInterfaceForClassA,(void**)clsAInterface; 
} 
STDMETHODIMP CInterfaceForClassB::getClassA(IInterfaceForClassA ** returnVal) 
{ 
    clsAInterface->QueryInterface(IID_IInterfaceForClassA,(void**)returnVal); 
} 

et enfin j'ai projet aC# qui comprend la dll ATL, dans le projet C# i appelle ATL classes dll:

 InterfaceForClassA clsa1 = new InterfaceForClassA(); 
     clsa1.createClassAObject(); 
     clsa1.setNumberInClassA(12); 

     InterfaceForClassB clsb = new InterfaceForClassB(); 
     clsb.setClassA(clsa1); 

     InterfaceForClassA clsa2 = new InterfaceForClassA(); 
     clsa2 = clsb.getClassA(); 

     Console.WriteLine("number: " + clsa2.getNumberInClassA()); 

et quand j'exécute le projet C#, il donne l'erreur NullReferenceException dans la dernière ligne ci-dessus. Pouvez-vous m'aider?

Répondre

0

Votre implémentation CInterfaceForClassB :: setClassA est incorrecte. Il devrait être (notez le &):

STDMETHODIMP CInterfaceForClassB::setClassA(IInterfaceForClassA * val) 
{ 
    val->QueryInterface(IID_IInterfaceForClassA,(void**)&clsAInterface); 
} 
Questions connexes