背景

  • 产品使用MySQL来存储报警服务产生的报警。在报警服务的组件中使用ADO接口
  • 客户方有两台计算机,一台计算机A用来组态,且可以对设备进行调试,操作系统是Win7 64bit 专业版,安装了VS2010;另一台计算机B用作验收后生产环境中使用,操作系统是Win 2008 R2 标准版
  • 我个人在公司的工作机的操作环境是win10 64bit 企业版

问题

在客户公司时,组态、开发、调试都是在计算机A上进行的,运行也是在计算机A上。一切都很正常。当调试完后,就从现场回到杭州,可是后续又出现了一些问题,了解完后就在公司的工作机上进行了实现与编译。之后将修改后的模块发到现场的同事那。当他将完整的系统和新变更的补丁部署到B机后,运行系统,发现报警服务并没有对新产生的报警进行记录。后来远程进行调试后发现,_ConectionPtr指针在调用open时发生了异常,异常信息为“不支持此类借口”。当时第一反应就是MySQL的驱动有没有安装好。在确认完这个完整安装后,重新安装了系统,发现结果还是一样。但是同样的代码,同样的环境,在之前的发行版本中一定是测试过的。而且我自己也在公司的工作机上安装了虚拟机后,拿发行版进行验证,一切都没问题。百思不得其解。后来在检查代码过程中,在同_ConectionPtr指针调用open的同一个cpp中,发现了一行代码:

  1 #import "c:\Program Files\Common Files\System\Ado\MSADO15.DLL" no_namespace rename("EOF","EndOfFile")

公司的联编机器的操作系统是win7,而我的工作机是win10。初步怀疑是上面这个dll的问题。在工作机上写了一个demo,在工作机与B机运行的结果不一样,之后将B机的msado15.dll拷贝到工作机进行编译后,发现两方运行的结果一致。

原因

其实这个bug之前就有同事踩到,可是并没有将此问题扩展到产品所有与MySQL相关联的模块进行排查。导致一个坑被踩了两次。根本原因是系统已经更改了COM的IID,导致用老的__uuidof(Connection)会提示E_NOINTERFACE (0X80004002)。

解决办法

1.将生产环境的msado15.dll拷贝到编译环境下进行编译

2.使用微软提供的Msado60_Backcompat_i386.tlb进行编译,参考此链接

总结

这种写死到某个绝对路径的做法确实值得商榷,尤其是依赖到系统的模块时,情况会更糟。如果必须依赖特定的系统dll,那么最好还是随着产品的代码库一起进行编译。而不是跟随编译环境。

[原]捉虫记3:_ConectionPtr指针调用open失败的更多相关文章

  1. 捉虫记(四)线程安全导致的HighCpu

    一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...

  2. 捉虫记:SHGetSpecialFolderPath返回错误码为2

    通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...

  3. PHP(SentCMS)网站 “新手”捉虫记

    我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维 ...

  4. 捉虫记2:windows程序句柄泄露的上下文环境

    作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...

  5. MapReduce全局变量之捉虫记

    全局变量 写MapReduce程序时候,有时候须要用到全局变量,经常使用的全局变量实现由三种方式: 通过作业的Configuration传递全局变量.作业初始化的时候.conf.set(),须要的时候 ...

  6. 一次MySQL(INNODB存储引擎) 死锁捉虫记

    前言 任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况.以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏 ...

  7. cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())

    void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...

  8. 【转】C#传委托给C的函数指针调用问题

    C#传委托给C的函数指针调用问题C代码如下: #include "stdio.h" __declspec(dllexport) int Call(int (*qq)(int num ...

  9. keil 中用函数指针调用函数的参数限制

    NSIC中,通过函数指针调用的函数的参数的个数没有限制,但是KeilC对此有限制,至多3个参数.因为,KeilC编译时,无法通过函数指针找到该函数的局部数据段,也就无法通过局部数据段传递参数,只能通过 ...

随机推荐

  1. 3dmax详细讲解全套攻略在线视频教程

    课程目录 试学课 课时11MAX2012学习软件指导 试学课 课时22MAX2012界面介绍 试学课 课时33MAX2012工作准备设置 试学课 课时44长方体的创建 试学课 课时55圆锥体的创建 试 ...

  2. 用css3写出来的进度条

    夜深了,废话不多说,先上代码: <style> * { box-sizing: border-box } .wrapper { width: 350px; margin: 200px au ...

  3. CentOS安装libpcap

    1.安装GCC:  yum -y install gcc-c++ 2.安装flex:   yum -y install flex   没有flex,直接安装libpcap会提示"Your o ...

  4. phpcms v9修改栏目描述的多行文本为编辑器方法

    phpcms v9在添加栏目的时候,栏目描述为多行文本,无法满足有图片,以及格式的修改调整,那么仿站网今天告诉大家如何将他改为编辑器,方法如下 找到phpcms/moudles/admin/templ ...

  5. 在asp.net mvc中如何使用Grid++ Report (锐浪报表)

    在asp.net mvc中如何使用Grid++ Report (锐浪报表) 在cshtml,razor中的处理方法 以官方的asp.net(csharp)中的第一个示例"1a.简单表格&qu ...

  6. python 模拟ajax查询社工库...

    在windows中使用,输入有关信息查询社工库,本来是网页版的,我把ajax请求提取出来.粗略的封装下,挺好玩. #coding:utf8 import urllib2,urllib from Bea ...

  7. 使用bootstrap+asp.net mvc4+IBatis.Net实现的小程序

    这个项目用到了三个技术点 1.bootstap 3.0 2.asp.net mvc4 3.IBatis.Net 这个三个技术点分别解决前端界面展示.中间mvc路由控制.实体框架映射数据访问 重点分页问 ...

  8. 2014年辛星完全解读Javascript第八节 json

    json是JavaScript Object Notation的简写,它是一种轻量级的数据交换格式,而且表达上很容易靠字面去理解.json是用于存储和传输数据的格式,通常用于向服务器端传递数据. ** ...

  9. fragment第二次载入就报错

    1.布局中加入一个<fragment 标签,第一次载入的时候是正常的,第二次加载的时候,就直接crashed,退出 2.查到原因Caused by: java.lang.IllegalArgum ...

  10. Oracle中对象权限与系统权限revoke

    实验: 1.以sys登陆,创建用户test1, test2: 2.授予test1系统权限(带admin option)-connect,授予test1对象权限(带grant option)-selec ...