调用自己写的MFC dll出错,该如何处理
调用自己写的MFC dll出错,
错误如图:


下面的代码段为DLL中函数段的实现;
DLL中结构体和类的声明及实现如下:
Camera.h
结构体:
DLL中全局变量的声明如下:
------解决方案--------------------
哪个DLL申请内存,哪个DLL释放内存;STL容器不能跨DLL使用。
源头似乎是每个EXE和DLL都有各自的内存管理堆,一个堆不能释放由另一个堆管理的内存,传地址没用
------解决方案--------------------
ConnectChannel(string _ipAdress)形参用string应该没太大问题,如果是非const引用或指针就有问题。不过还是不推荐写DLL接口时使用STL。我觉得出错的地方应该是全局vector的使用,就像8楼说的。exe和DLL有可能操作同一个vector,不可避免的会有push导致的重分配内存。
错误如图:
下面的代码段为DLL中函数段的实现;
__declspec(dllexport) int ConnectChannel(string _ipAdress)
{
Camera _camera;
_camera.WaitTime=WaitTime;
_camera.TryCount=TryCount;
string ipAdress;
ipAdress=_ipAdress;
if (!ipAdress.empty())
{
_camera.Capture.open(ipAdress);
VideoCap m_video;
m_video.vCap=_camera.Capture;
m_video.vCapID=_camera.camID;
CapVect.push_back(m_video);
}
else
{
return -1;
}
time_t timeBegin, timeEnd;
int temp=0;
timeBegin = time(NULL);
timeEnd = time(NULL);
while(!_camera.Capture.isOpened()&&(timeEnd-timeBegin)<_camera.WaitTime||temp<_camera.TryCount)
{
_camera.Capture.open(ipAdress);
timeEnd = time(NULL);
temp++;
}
if (!_camera.Capture.isOpened())
{
return -1;
}
return _camera.camID;
}
DLL中结构体和类的声明及实现如下:
Camera.h
#pragma once
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
// Camera 命令目标;
class Camera : public CObject
{
private:
static int camNum;
public:
Camera();
public:
int camID; //摄像头编号;
int WaitTime; //连接等待时间;
int TryCount; //连接尝试次数;
VideoCapture Capture;
virtual ~Camera();
};
// Camera.cpp : 实现文件
//
#include "stdafx.h"
#include "BoLiSDK.h"
#include "Camera.h"
int Camera::camNum=1000;
Camera::Camera()
{
camID=++(this->camNum);
WaitTime=0;
TryCount=0;
//Capture=NULL;
}
Camera::~Camera()
{
}
结构体:
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
//定义结构体,关联摄像头和摄像头ID;
typedef struct VideoCap
{
int vCapID; //摄像头ID;
VideoCapture vCap;//摄像头;
}VideoCap;
//定义结构体,关联录制视频及其ID;
typedef struct VideoWrite
{
int vWriteID; //正录制的视频的ID;
bool IsRecord; //判断是否正在录制过程中;
VideoWriter vWrite; //录制的视频;
}VideoWrite;
DLL中全局变量的声明如下:
vector<VideoCap> CapVect(20); //摄像头结构体向量;
vector<VideoWrite> WriteVect(20); //录制视频结构体向量;
int WaitTime; //连接等待时间;
int TryCount; //连接尝试次数;
------解决方案--------------------
哪个DLL申请内存,哪个DLL释放内存;STL容器不能跨DLL使用。
源头似乎是每个EXE和DLL都有各自的内存管理堆,一个堆不能释放由另一个堆管理的内存,传地址没用
------解决方案--------------------
ConnectChannel(string _ipAdress)形参用string应该没太大问题,如果是非const引用或指针就有问题。不过还是不推荐写DLL接口时使用STL。我觉得出错的地方应该是全局vector的使用,就像8楼说的。exe和DLL有可能操作同一个vector,不可避免的会有push导致的重分配内存。