我用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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。