本人在利用QT对海康威视摄像机进行SDK的二次开发时,在自己的电脑上可以运行,但是打包到其他电脑上运行时,总是出现预览失败地问题。
初始化函数NET_DVR_Init()和登录函数NET_DVR_Login_V30()均没有问题,但是运行到图像预览函数NET_DVR_RealPlay_V40()时总是出现问题,显示预览失败。
通过调试发现错误代码为157,查手册表示加载ssleay32.dll库失败。
但是在SDK中的HCNetSDKCom文件夹中,已经包括了ssleay32.dll库文件,不知道是什么问题。
经过反复的尝试,终于找到了解决方案,供大家参考。
1. 方法一
根据网上找的ssleay32.dll库失败的方法
64位系统复制文件到c:\Windows\SysWOW64,开始-程序-附件-命令提示符,右键点击,管理员身份运行。键入:regsvr32 c:\Windows\SysWOW64\ssleay32.dll即可。
通过把ssleay32.dll库复制到指定位置,发现运行失败。
2. 方法二
根据提示,把ssleay32.dll库连同EXE一起打包发布,发现还是会出现“加载ssleay32.dll库失败”的情况。
3. 方法三
通过和海康的SDK技术人员沟通,建议添加如下代码:
增加调用NET_DVR_SetSDKInitCfg(enumType类型赋值为3,lpInBuff对应libcrypto.so所在的路径字符串)、NET_DVR_SetSDKInitCfg(enumType类型赋值为4,lpInBuff对应libssl.so所在的路径字符串)指定下这些库文件加载路径看看。
NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_LIBEAY_PATH, “libeay32.dll”))
NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_SSLEAY_PATH, “ssleay32.dll”))
//可以使用绝对路径
按照技术人员的建议,发现我这里NET_DVR_SetSDKInitCfg 函数的第一个参数定义格式如下:
typedef enum tagNET_SDK_INIT_CFG_TYPE
{
NET_SDK_INIT_CFG_TYPE_CHECK_MODULE_COM = 0,
NET_SDK_INIT_CFG_ABILITY = 1,
NET_SDK_INIT_CFG_SDK_PATH = 2
}NET_SDK_INIT_CFG_TYPE;
第一个参数enumType无法选择3和4,也找不到常量NET_SDK_INIT_CFG_LIBEAY_PATH和NET_SDK_INIT_CFG_SSLEAY_PATH。通过试验还是未解决。
根据技术人员的提示,我发现可能是缺少libeay32.dll库文件所导致的,故把libeay32.dll和ssleay32.dll两个文件都打包进去,最后发现成功实现了。
此外,我还发现了几个小问题,防止大家踩坑。
- libeay32.dll和ssleay32.dll这两个库文件的版本很多,只能用特定的一种。
- 多个窗体需要预览时,NET_DVR_RealPlay_V40函数最好不要写在一个函数中。
- SDK中自带的几个dll文件要放到Debug或Release中才可以运行。
以上就是我探究的利用QT对海康威视SDK二次开发时,打包后在其他电脑运行提示加载ssleay32.dll库失败的解决方案。