15,471
社区成员
发帖
与我相关
我的任务
分享
__declspec(dllexport) long __stdcall TestArr(LPSAFEARRAY *VbArray,long nNewEle)
{
LPSAFEARRAY pSa;
SAFEARRAYBOUND iBound;
iBound.lLbound = 0; // 数组起始位
iBound.cElements = nNewEle; // 数组元素
long nPreEle(0);
if (*VbArray == NULL){
if ((pSa = SafeArrayCreate(VT_I4,1,&iBound)) == NULL) return -1;// 创建SafeArray描述符
try{
nPreEle = (*VbArray)->rgsabound->cElements;
}catch(...){
nPreEle = 0;
}
*VbArray = pSa;// 返回SafeArray描述符
}else{
if ((*VbArray)->cDims != 1) return -1;//一维数组
nPreEle = (*VbArray)->rgsabound->cElements;
}
long *pNew=(long *)malloc(nNewEle*sizeof(long));
if (pNew != NULL) {
memset(pNew,0,nNewEle*sizeof(long));
if (nPreEle>0) {//复制原数组元素
long *pData = NULL;
SafeArrayAccessData(*VbArray,(LPVOID *)&pData);
if (pData != NULL) {
if (nPreEle<=nNewEle) {
memcpy(pNew,pData,nPreEle*sizeof(long));
} else {
memcpy(pNew,pData,nNewEle*sizeof(long));
}
}
SafeArrayUnlock(*VbArray);
}
for(long i=nPreEle; i<nNewEle; i++)
pNew[i]=nNewEle-i;
SafeArrayRedim(*VbArray,&iBound);
(*VbArray)->pvData = pNew;
return 1;
}else{
return -1;
}
}
Private Declare Function TestArr Lib "ArrTest.dll" (nArr() As Long, ByVal nNewEle As Long) As Long
Private Sub Command1_Click()
Dim nArr() As Long, n As Long
n = TestArr(nArr, 15000)
Debug.Print n,
n = TestArr(nArr, 90)
Debug.Print n,
'n = TestArr(nArr, 600)
'Debug.Print n
End Sub
long *pNew=(long *)malloc(nNewEle*sizeof(long));
if (pNew != NULL) {
memset(pNew,0,nNewEle*sizeof(long));
long *pData = NULL;
if( SUCCEEDED( SafeArrayAccessData(*VbArray,(LPVOID *)&pData) ) ){
if (nPreEle>0) {//复制原数组元素
if (nPreEle<=nNewEle) {
memcpy(pNew,pData,nPreEle*sizeof(long));
} else {
memcpy(pNew,pData,nNewEle*sizeof(long));
}
}
SafeArrayUnlock(*VbArray);
for(long i=nPreEle; i<nNewEle; i++)
pNew[i]=nNewEle-i;
SafeArrayRedim(*VbArray,&iBound);//重定大小
if ( SUCCEEDED( SafeArrayAccessData(*VbArray,(LPVOID *)&pData) ) ) {//重获指针
memcpy(pData,pNew,nNewEle*sizeof(long));
nPreEle=1;
}else{nPreEle=-1;}
}else{nPreEle=-1;}
SafeArrayUnaccessData(*VbArray);
free(pNew);
return nPreEle;
}else{return -1;}