代码复杂,请高手指点
下面组件在调用调用结束后会产生一个异常,请高手指点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