开发者社区> 问答> 正文

关于dll中全局变量的问题 400 请求报错 

我用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

展开
收起
kun坤 2020-05-30 14:30:23 488 0
1 条回答
写回答
取消 提交回答
  • 在CLog的析构函数加个断点 , 调试程序, 看有没进入断点 ,然后再看Stack调用######回复 @mental : 验证了会调用~CLog之后呢######回复 @那朵花 : 把dll的Debug Command 改为应用程序的路径就可以调试了######我加了日志证明~CLog也调用######应用程序(是别人的)是黑盒的通过Load库进来的所以我加了断点也没用。

    2020-05-30 14:30:31
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载