描述:
我在ActiveX中定义了两个方法,一个是GetData,一个是SetData,参数类型都是VARIANT,
可是当外部程序调用时却出现问题,在VC中调用正常,可是换成BCB调用时,只有SetData函数通过,GetData函数却一直出现异常,一调试,发现调用GetData后,vData的值根本就没变过,这是怎么回事呀!
/* ActiveX中的代码 */
long CFuYouCtrl::SetData(const VARIANT FAR& vData)
{
// TODO: Add your dispatch handler code here
void* pDest;
SafeArrayAccessData(vData.parray, &pDest);
memcpy(m_Fuyou, pDest, vData.parray->rgsabound[0].cElements);
SafeArrayUnaccessData(vData.parray);
Invalidate();
return 0;
}
long CFuYouCtrl::GetData(VARIANT FAR* pvData)
{
// TODO: Add your dispatch handler code here
pvData->vt = VT_UI1 | VT_ARRAY;
SAFEARRAYBOUND bound;
bound.cElements = strlen(m_Fuyou);
bound.lLbound = 0;
pvData->parray = SafeArrayCreate(VT_UI1, 1, &bound); // Create it
void* pDest;
SafeArrayAccessData(pvData->parray, &pDest);
memcpy(pDest, m_Fuyou, strlen(m_Fuyou)); // Copy into array
SafeArrayUnaccessData(pvData->parray);
return 0;
}
/* VC 调用的代码 */
void CFuyouTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
char fBuf[]="hello";
VARIANT varTemp;
varTemp.vt = VT_UI1 | VT_ARRAY;
SAFEARRAYBOUND bound;
bound.cElements = strlen(fBuf);
bound.lLbound = 0;
varTemp.parray = SafeArrayCreate(VT_UI1, 1, &bound); // Create it
void* pDest;
SafeArrayAccessData(varTemp.parray, &pDest);
memcpy(pDest, fBuf, strlen(fBuf)); // Copy into array
SafeArrayUnaccessData(varTemp.parray);
m_Fuyou.SetData(varTemp);
SafeArrayDestroy(varTemp.parray);
}
void CFuyouTestDlg::OnButton2()
{
// TODO: Add your control notification handler code here
char fBuf[256];
VARIANT varTemp;
m_Fuyou.GetData(&varTemp);
memcpy(fBuf,varTemp.parray->pvData,varTemp.parray->rgsabound[0].cElements);
fBuf[varTemp.parray->rgsabound[0].cElements]='\0';
MessageBox(fBuf);
SafeArrayDestroy(varTemp.parray);
}
/* BCB 调用的代码*/
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char fBuf[]="hello";
VARIANT varTemp;
varTemp.vt = VT_UI1 | VT_ARRAY;
SAFEARRAYBOUND bound;
bound.cElements = strlen(fBuf);
bound.lLbound = 0;
varTemp.parray = SafeArrayCreate(VT_UI1, 1, &bound); // Create it
void* pDest;
SafeArrayAccessData(varTemp.parray, &pDest);
memcpy(pDest, fBuf, strlen(fBuf)); // Copy into array
SafeArrayUnaccessData(varTemp.parray);
FuYou1->SetData(varTemp);
SafeArrayDestroy(varTemp.parray);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char fBuf[256];
VARIANT varTemp;
FuYou1->GetData(&varTemp);
memcpy(fBuf,varTemp.parray->pvData,varTemp.parray->rgsabound[0].cElements);
fBuf[varTemp.parray->rgsabound[0].cElements]='\0';
Edit1->Text = fBuf;
SafeArrayDestroy(varTemp.parray);
}