在ATL中将接口作为参数传递 我有一个本地C++ dll和两个类: classA { void setNumber(int number); int getNumber(); } classB { void setclassA(classA*); classA* getclassA(); } 我有一个ATL DLL,它封装了本机C++ DLL和两个接口:IdFruteFraceCa,IdFruteFrExcBr.< /P>

在ATL中将接口作为参数传递 我有一个本地C++ dll和两个类: classA { void setNumber(int number); int getNumber(); } classB { void setclassA(classA*); classA* getclassA(); } 我有一个ATL DLL,它封装了本机C++ DLL和两个接口:IdFruteFraceCa,IdFruteFrExcBr.< /P>,dll,atl,Dll,Atl,接口福拉萨: STDMETHODIMP CInterfaceForClassA::createClassAObject(void) { ClassA* Aobject = new ClassA(); return S_OK; } STDMETHODIMP CInterfaceForClassA::setNumberInClassA(SHORT pVal) { if(Aobject != NULL) Aobject->

接口福拉萨:

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;
}
接口流程B:

IInterfaceForClassA* clsAInterface;
STDMETHODIMP CInterfaceForClassB::setClassA(IInterfaceForClassA * val)
{
   val->QueryInterface(IID_IInterfaceForClassA,(void**)clsAInterface;
}
STDMETHODIMP CInterfaceForClassB::getClassA(IInterfaceForClassA ** returnVal)
{
   clsAInterface->QueryInterface(IID_IInterfaceForClassA,(void**)returnVal);
}
最后我有一个包含ATL dll的c项目,在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错误。您能帮助我吗?

您的CInterfaceForClassB::setClassA实现不正确。应该注意&:

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