Dll中SAFEARRAY内存泄漏的问题
要写个DLL给VB调用,实现从VB中传入一个动态数组,DLL中进行处理及调整数组大小后返回。
C++中的测试代码如下:
VB中的测试代码如下:
由于内存没有释放,VB中运行到TestArr(nArr, 600)时就崩溃了。
请问在DLL的代码中,原来(*VbArray)->pvData所指向的内存怎么释放?
C++中的测试代码如下:
__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;
}
}VB中的测试代码如下:
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由于内存没有释放,VB中运行到TestArr(nArr, 600)时就崩溃了。
请问在DLL的代码中,原来(*VbArray)->pvData所指向的内存怎么释放?
...全文
相关推荐
SafeArray使用.doc
本文档主要讲述的是SafeArray使用;SafeArray是VB中的数组存储方式。通过SafeArray,可以在VC++和VB间相互调用。SafeArray也是Automation中的标准数组存储方式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
C++Builder调用C# DLL的实操工程:含COM注册、TLB头文件与BCB调用代码
一套开箱即用的跨语言集成方案,专为C++Builder开发者设计,解决在BCB项目中调用C#编写的DLL组件的实际问题。资源包含完整的C#类库源码(已配置COM可见性)、生成并注册的类型库(.tlb)、对应OCX资源文件,以及C++Builder端工程文件(.cbproj)、主窗体实现(MainForm.cpp/.h/.dfm)和关键TLB头文件(如mscorlib_TLB.h、ClassLibrary1_TLB.h)。支持通过#import指令自动导入类型信息,也提供CoCreateInstance手动创
Java-COM中间件 JACOB源码
Java-COM中间件 JACOB源码
ATL数组传递详细说明
atl mfc dll里面数组传递知识,详细介绍如何封装dll函数中数组返回与引用
易语言源码IN32API功能150个(屏幕篇)
易语言源码IN32API功能150个(屏幕篇)


进程/线程/DLL
