问题现象:服务器升级到x64版本后,onvif发现失败,无法添加Onvif设备

原因:项目中Onvif发现使用的是gsoap,在cpp中声明了soap指针(1),在c中为soap申请内存(2),在cpp中对soap的成员变量赋值(3),出现问题。

C++与C混用,导致Onvif发现失败

(1)在cpp中声明指向soap结构体的指针,有虚析构函数,所以soap指针指向的前8个字节指向虚函数表(32位程序中是4个字节)

C++与C混用,导致Onvif发现失败

(2)在c中为soap申请内存,大小是c标准的soap结构体大小,不包括虚函数表指针,比c++标准的soap结构体大小少8个字节(32位程序的话是4个字节)。在c中为soap赋值初始化等,与c++中的指针相比,错位了8个字节(32位程序的话是4个字节)

C++与C混用,导致Onvif发现失败

(3)在C++中直接调用c的关于soap的函数,可正常运行,在(3)处直接对指针指向的C++类的成员变量进行赋值,由于错位了8个字节,导致程序执行出现问题

解决办法有如下两种,任选一种即可

1.  在c中增加soap的配置文件,使对超时时间的配置在c中实现,避免错位导致的问题

C++与C混用,导致Onvif发现失败

2.修改项目属性,强制编译为C++代码

C++与C混用,导致Onvif发现失败

相关文章:

  • 2021-12-08
  • 2021-04-12
  • 2021-05-21
  • 2021-12-12
  • 2022-12-23
  • 2022-01-10
  • 2022-12-23
  • 2021-12-21
猜你喜欢
  • 2022-12-23
  • 2021-12-29
  • 2022-12-23
  • 2021-06-06
  • 2022-12-23
  • 2021-12-03
  • 2022-01-13
相关资源
相似解决方案