2010-03-31 90 views
1

我有一個本地C++ DLL和兩類:傳遞接口作爲參數在ATL

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

我有一個ATL DLL一個包裝機C++ DLL和兩個接口: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); 
} 

最後我有一個C#項目,包括ATL的DLL,在C#項目我打電話ATL 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()); 

當我運行C#項目時,它會在上面最後一行中給出NullReferenceException錯誤。你可以幫我嗎?

回答

0

您的CInterfaceForClassB :: setClassA實現不正確。應該是(注意&):

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