当前位置:编程学习 > C#/ASP.NET >>

代码复杂,请高手指点

下面组件在调用调用结束后会产生一个异常,请高手指点
class ATL_NO_VTABLE CC302_ECM : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CC302_ECM, &CLSID_C302_ECM>,
public IDispatchImpl<IC302_ECM, &IID_IC302_ECM, &LIBID_PROTOCOLLib>
{
public:
CC302_ECM()
{
SAFEARRAYBOUND rgsabound[1];     
rgsabound[0].lLbound = 0;       
rgsabound[0].cElements = 20;    
m_psaElement = SafeArrayCreate(VT_VARIANT,1,rgsabound);  

SAFEARRAYBOUND rgsaboundEx[1];   
rgsaboundEx[0].lLbound = 0;       
rgsaboundEx[0].cElements = 20;
m_psaRetVal = SafeArrayCreate(VT_VARIANT,1,rgsaboundEx);
}

~CC302_ECM()
{
if (m_psaElement != NULL)
{
SafeArrayDestroy(m_psaElement);
}

if (m_psaRetVal != NULL)
{
SafeArrayDestroy(m_psaRetVal);
}
}

DECLARE_REGISTRY_RESOURCEID(IDR_C302_ECM)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CC302_ECM)
COM_INTERFACE_ENTRY(IC302_ECM)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IC302_ECM
public:
STDMETHOD(ReadDataByLocalIdentifier)(/*[in]*/ VARIANT varInData, /*[out]*/ VARIANT *pvarOutData);

private:
ISO14230_ApplicationLayer m_c14230AL;
C302Ecm_ApplicationLayer m_cC302EcmAL;
ISO14230_ApplicationLayer * m_p14230AL;
SAFEARRAY * m_psaElement;
SAFEARRAY * m_psaRetVal;
_variant_t m_varElement;
};

STDMETHODIMP CC302_ECM::ReadDataByLocalIdentifier(VARIANT varInData, VARIANT *pvarOutData)
{
m_varElement.vt = VT_ARRAY | VT_VARIANT;

unsigned char szTest1[5];
szTest1[0] = 0x30;
szTest1[1] = 0x31;
szTest1[2] = 0x32;
szTest1[3] = 0x33;
szTest1[4] = 0x34;

_variant_t v_pppp[20];
for (long i=0; i<20; i++)   
{
v_pppp[i] = szTest1[i];
}

for(long index1=0; index1<20; index1++)  

HRESULT hr = SafeArrayPutElement(m_psaElement,&index1,&v_pppp[index1]);
if(FAILED(hr) != S_OK) 
{
return hr;
}
}

m_varElement.parray = m_psaElement;

_variant_t vt("hi baby!");

//对psa里每个元素赋值
for(long index=0; index<20; index++) 

HRESULT hr = SafeArrayPutElement(m_psaRetVal,&index,&vt);
if(FAILED(hr) != S_OK) 
{
return hr;
}
}

         long lll = 0;
    
SafeArrayPutElement(m_psaRetVal,&lll,&m_varElement);
pvarOutData->vt = VT_ARRAY | VT_VARIANT;  
pvarOutData->parray = m_psaRetVal;     

//封装到第二个元素里
unsigned char szTest2[5];
szTest2[0] = 0x64;
szTest2[1] = 0x65;
szTest2[2] = 0x66;
szTest2[3] = 0x67;
szTest2[4] = 0x68;

for (i=0; i<20; i++)
{
v_pppp[i] = szTest2[i];
}

for(index1=0; index1<20; index1++) 

HRESULT hr = SafeArrayPutElement(m_psaElement,&index1,&v_pppp[index1]);
if(FAILED(hr) != S_OK) 
{
return hr;
}
}

m_varElement.parray = m_psaElement;

//第一个元素
         lll = 1;
    
SafeArrayPutElement(m_psaRetVal,&lll,&m_varElement);
pvarOutData->vt = VT_ARRAY | VT_VARIANT;  
pvarOutData->parray = m_psaRetVal;     

return S_OK;
} --------------------编程问答-------------------- for (i=0; i <20; i++) 

v_pppp[i] = szTest2[i]; 


--------------------编程问答-------------------- “whycom”给出的解答是什么意思啊?请指教! --------------------编程问答-------------------- unsigned char szTest2[5]; //数组长度才是5

szTest2[0] = 0x64;
szTest2[1] = 0x65;
szTest2[2] = 0x66;
szTest2[3] = 0x67;
szTest2[4] = 0x68;

for (i=0; i <20; i++) //这里却访问第20个元素

{
v_pppp[i] = szTest2[i];
}  --------------------编程问答-------------------- 高手,我改了,还是不行啊?请指点! --------------------编程问答-------------------- --------------------编程问答-------------------- 我是进来学习的。 --------------------编程问答-------------------- 进来学习 --------------------编程问答-------------------- study
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,