我在用 C++/CLR 写了一个DLL文件 然后用C#调用出现问题,当时我测试的时候是用C++/CLR测试的,没有问题,但是用C#调用方法的时候 就出现了问题,我跟踪程序说是System.StackOverflowException 这个异常。但是我一步一步的跟踪,有时候能跑通,有时候就出现这个问题,郁闷死了,请各位大侠看看。代码如下:我肯定是下面的函数里出了问题:int getCDP(CDP_RESTORATION_INFO osnvolumeGuid,GET_CDP_STATE::CCdp_ ^cdp_ )
{
CDP_RESTORATION_INFO RestoreInfo;
CDP_RESTORE_STATE RestoreState;
SNAPSHOT_INFO * info = (SNAPSHOT_INFO *)GlobalAlloc(LMEM_ZEROINIT,sizeof(SNAPSHOT_INFO ));
memset(info,0,sizeof(SNAPSHOT_INFO)); //CDP_SNAPSHOTID *cdpID = (CDP_SNAPSHOTID *)malloc(sizeof(CDP_SNAPSHOTID));
CDP_SNAPSHOTID *cdpID = (CDP_SNAPSHOTID *)GlobalAlloc(LMEM_ZEROINIT,sizeof(CDP_SNAPSHOTID));//有时候是这行出现System.StackOverflowException 内存溢出错误
#ifdef DEBUG
Console::WriteLine(cdpID);
#endif
memset(cdpID,0,sizeof(CDP_SNAPSHOTID)); memcpy( &cdpID->m_VolumeID.SAN_VolumeID.m_VolumeGuid ,&osnvolumeGuid,16);
memcpy( &RestoreInfo.m_SourceVolumeID.SAN_VolumeID.m_VolumeGuid,&osnvolumeGuid,16);
unsigned int i = 32*sizeof(_CDP_BUFFER_INFO);
PVOID * pBuf = (PVOID*)GlobalAlloc(LMEM_ZEROINIT,i);
memset(pBuf,0,i);
int aa = OsnCDPGetSnapshotList(cdpID,pBuf,&i);
if(i == 0)
return 1;
if(aa == 0)
{
int number = 0;
CDP_SNAPSHOTID * cdp_ID =(CDP_SNAPSHOTID * ) pBuf; while(1)
{

GET_CDP_STATE::CdpInfo_ ^cdpInfomation = gcnew GET_CDP_STATE::CdpInfo_();//有时候是这行出现System.StackOverflowException 内存溢出错误
#ifdef DEBUG
Console::WriteLine("{0},{1}",cdpInfomation->m_RestoredState,cdpInfomation->m_SnapshotTime);
Console::WriteLine(number);
/*Console::WriteLine(cdp_ID->m_SnapshotTime.ToString());*/
#endif
if(cdp_ID->m_SnapshotTime.HighPart== 0 &&cdp_ID->m_SnapshotTime.LowPart == 0)
{ cdp_->CountSnap = number.ToString();
break;
}
String ^aaa =Long64ToTime(cdp_ID->m_SnapshotTime);//有时候是这行出现System.StackOverflowException 内存溢出错误
#ifdef DEBUG
Console::WriteLine(aaa);
#endif
cdpInfomation->m_SnapshotTime = aaa; RestoreInfo.m_RestoreSnapshotTime.QuadPart=cdp_ID->m_SnapshotTime.QuadPart;
int ErrorCode=OSNCDPGetRestoreState(&RestoreInfo,&RestoreState);
if(ErrorCode == 0)
{
switch(RestoreState)
{
case 0:
cdpInfomation->m_RestoredState = "STATE_NOT_IN_RESTORE";
break;
case 1:
cdpInfomation->m_RestoredState = "STATE_START_RESTORE";
break;
case 2:
cdpInfomation->m_RestoredState = "STATE_RESTORING";
break;
case 3:
cdpInfomation->m_RestoredState = "STATE_RESTORED";
break;
case 4:
cdpInfomation->m_RestoredState = "STATE_ABORTED";
break;
case 5:
cdpInfomation->m_RestoredState = "STATE_RESTORING_ATBOOT";
break;
default:
break;
}
cdp_->cdpinfo->Add(cdpInfomation);
}
else
return ErrorCode; cdp_ID++;
number++;
} }
else
return aa; GlobalFree(info);
GlobalFree(cdpID);
GlobalFree(pBuf);
return 0;
}