[原]捉虫记3:_ConectionPtr指针调用open失败
背景
- 产品使用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失败的更多相关文章
- 捉虫记(四)线程安全导致的HighCpu
一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...
- 捉虫记:SHGetSpecialFolderPath返回错误码为2
通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...
- PHP(SentCMS)网站 “新手”捉虫记
我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维 ...
- 捉虫记2:windows程序句柄泄露的上下文环境
作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...
- MapReduce全局变量之捉虫记
全局变量 写MapReduce程序时候,有时候须要用到全局变量,经常使用的全局变量实现由三种方式: 通过作业的Configuration传递全局变量.作业初始化的时候.conf.set(),须要的时候 ...
- 一次MySQL(INNODB存储引擎) 死锁捉虫记
前言 任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况.以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏 ...
- cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())
void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...
- 【转】C#传委托给C的函数指针调用问题
C#传委托给C的函数指针调用问题C代码如下: #include "stdio.h" __declspec(dllexport) int Call(int (*qq)(int num ...
- keil 中用函数指针调用函数的参数限制
NSIC中,通过函数指针调用的函数的参数的个数没有限制,但是KeilC对此有限制,至多3个参数.因为,KeilC编译时,无法通过函数指针找到该函数的局部数据段,也就无法通过局部数据段传递参数,只能通过 ...
随机推荐
- 关于TCP的两个小练习_第一个博客~
先来一个本地的,客户端发送请求,服务端接收请求的简单代码 1 package com.TCP.java; 2 3 import java.io.IOException; 4 import java.i ...
- linux的SVN搭建与同步
以下的配置文件,开头都不能有空格 安装: yum install subversion 验证:svnserve --version 代码库创建:(类似,可以建立多个仓库)[repo]mkdir -p ...
- 【转】winform带参数启动另一个exe
启动EXE string arg1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; string arg2 = "bbbbbbbbbbbbbbbb ...
- Apache多站点设定
多端口 vi httpd.conf Listen 8090 <VirtualHost *:8090> ServerName localhost Documentroot "/Us ...
- Linux定时任务crontab每三秒执行一次shell
第一种方法:当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如下: cat kick.sh #!/bin/bash while : ;do /home/somedir/scrip ...
- api接口通信安全性
1.采用https协议传输数据 2.白名单.账号密码验证 3.密钥签名token 4.三次握手请求数据前,需要拿到密码才可以请求数据,否则异常
- Linux远程备份—ftp方式、NFS方式
问题:现在项目中每天都有从其它各个系统发过来的数据文件(存放在/var/data目录下,以.txt结尾),虽然很久以前的文件很少用到,占用了很多空间,却不能删除.于是,想把一个月以前的文件都压缩了传到 ...
- Asp.net MVC 如何向webform一样在IIS里添加虚拟目录
相信很多用webform的程序猿都习惯性的使用虚拟目录的形式来对一个程序添加新的功能,那么在mvc下该如何来弄呢? 首先得有一个项目基层的项目,然后我们在这个项目的基础上新增一个功能模块,例如信息发布 ...
- CLR.via.C#第三版 读书笔记
第一章 CLR的执行模型 1.1将源代码编译成托管代码 决定将.NET Framework作为自己的开发平台之后,第一步是决定要生成什么类型的应用程序或组件.假定你已经完成了这些次要的细节:一切都已经 ...
- Hibernate从入门到精通(四)基本映射
映射的概念 在上次的博文Hibernate从入门到精通(三)Hibernate配置文件我们已经讲解了一下Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里 ...