我用Vs2010写个dll是静态的,为一个vc++应用程序所用,在调试中我发现我在dll中定义的一个全局变量会在第一次被使用后就释放了。使我的程序出错,我想问一问有什么方法可以解决这个问题吗?
下面给出代码说明:
1头文件
#ifdef __VPRDEV_H__
#ifdef ELEMENT_EXPORTS
#define VPRDEV_API extern"C" __declspec(dllexport)
#else
#define VPRDEV_API extern"C" __declspec(dllimport)
#endif
//API函数
/*******************************************************************************************/
/*
*VPR_Init 用于初始化系统中的车牌识别系统
*hWndHandle 用于接收消息窗体的句柄。
*uMsg 用户自定义消息,当借口接收到车牌识别器的识别结果时,通过这个消息发送给窗口(hWndhandle)
*/
VPRDEV_API BOOL __stdcall VPR_Init(HWND hWndHandle,UINT uMsg);
/*
*VPR_Quit 用于关闭系统中的车牌照识别器
*/
VPRDEV_API BOOL __stdcall VPR_Quit();
/*
*VPR_Capture 向系统中的拍照识别器发送抓拍指令
*/
VPRDEV_API BOOL __stdcall VPR_Capture();
/*
*VPR_GetVehicleInfo 获取车牌号、车牌二值图、车辆JEPG图像。
*pchPlate 返回车牌号
*piByteBinImageLen 返回车辆二值图的大小
*pByteBinImage 返回车牌二值图
*pijepgImageLen 返回车辆JEPG图像的大小
*pByteJepgImage 返回车辆的图片,为JPEG格式
*/
VPRDEV_API BOOL __stdcall VPR_GetVehicleInfo(char*pchPlate,
int *piByteBinImageLen,
BYTE* pByteBinImage,
int*piJpegImageLen,
BYTE *pByteJpegImage);
/*
*VPR_ComparePlate 比较两个车牌号码字符串
*bFullCompare FALSE值为非整牌比较,IRute值有效,TRUE值为整牌比较,iRute无效
*iRute 非整牌比较时比较的位数范围,汉字作为一个字符比较
*chPlateIn 入口车牌号码
*chPalteOut 出口车牌号码
*返回值 0完全匹配(100%)1匹配(85%~100%)2基本匹配(70~85%)3不匹配(0~70%)
*/
VPRDEV_API int __stdcall VPR_ComparePlate(BOOL bFullCompare,
int iRute,
char*chPlateIn,
char*chPlateOut);
/*
*BOOL VPR_ComparePlateBin 比较2个车牌二值化图片
*lpBinImageIn 入口车牌二值化图(用户必须申请至少280字节的空间)
*lpBinImageOut 出口车牌二值化图(用户必须申请至少280字节的空间)
*/
VPRDEV_API BOOL __stdcall VPR_ComparePlateBin(BYTE * lpBinImageIn,BYTE*lpBinImageOut);
/*
*VPR_Video 视屏
*hwnd 视屏窗口的父窗口句柄
*nLeft 窗口的左边界
*nRight 窗口的右边界
*nTop 窗口的上边界
*nBottom 窗口的下边界
*bShow 是否显示
*/
VPRDEV_API BOOL __stdcall VPR_Video(HWND hwnd,
int nLeft,
int nTop,
int nRight,
int nBottom,
BOOL bShow);
/*
*VPR_CheckStatus 检查拍照识别器状态
*chVprDevStatus 拍照识别器状态说明,返回值
*/
VPRDEV_API BOOL __stdcall VPR_CheckSatus(char* chVprDevStatus);
/*
*VPR_BinImage2BMP 二值化车牌数据转换为BMP图片。
*pByteBinImage 车牌二值图
*iByteBinImageLen 车牌二值图大小
*pchBMPFileName 车牌图片的完整路径
*/
VPRDEV_API BOOL __stdcall VPR_BinImage2BMP(int iByteBinImageLen,
BYTE *pByteBinImage,
char *pchBMPFileName);
2部分实现代码
#include "stdafx.h"
#include "VPRDev.h"
#include "DImgPro.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
VPRDev vprdev;
CLog m_log;
/*******************************************************************************************/
/*
*VPR_Init 用于初始化系统中的车牌识别系统
*hWndHandle 用于接收消息窗体的句柄。
*uMsg 用户自定义消息,当接口接收到车牌识别器的识别结果时,通过这个消息发送给窗口(hWndhandle)
*/
BOOL __stdcall VPR_Init(HWND hWndHandle,UINT uMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
m_log.WriteLog("开始VPR_Init\r\n");
if(vprdev.StartLink()==FALSE) return FALSE;
vprdev.SetMSGInfo(hWndHandle,uMsg);
m_log.WriteLog("结束VPR_Init\r\n");
return TRUE;
}
3VPRDEV的定义和实现分别在头文件“DImgPro.h”和“DImgPro.cpp”中
4 Clog是我自己写的一个小型日志类
最后日志内容如下:
开始VPR_Init
开始StartLink()
调用Setarming
结束StartLink()
结束VPR_Init
调用~VPRDev
调用Stoplink
调用Disarming
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。