[原]捉虫记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编译时,无法通过函数指针找到该函数的局部数据段,也就无法通过局部数据段传递参数,只能通过 ...
随机推荐
- [转]C#发送Email邮件 (实例:QQ邮箱和Gmail邮箱)
下面用到的邮件账号和密码都不是真实的,需要测试就换成自己的邮件账号. 需要引用:using System.Net.Mail;using System.Text;using System.Net; 程序 ...
- mysql 主从同步 Last_SQL_Error
参考文章: http://kerry.blog.51cto.com/172631/277414/ http://hancang2010.blog.163.com/blog/static/1824602 ...
- c#汉字转为拼音
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressi ...
- Mysql MyISAM数据库批量转换表引擎为Innodb
Mysql MyISAM数据库批量转换表引擎为Innodb 最近在做事物处理需要把表结构都改为带有支持事物的Innodb引擎格式, 把里面数据库 用户名.密码 等信息修改为你自己的,放在网站下运行即可 ...
- Dapper full example
Skip to content Sign up Sign in This repository Explore Features Enterprise Blog Watch Star , Fork S ...
- 《C和指针》读书笔记——第五章 操作符和表达式
1.当/操作符的两个操作数都是整数时,它执行整除运算:其他都是执行浮点数除法. 2.逻辑移位:左边移入的位用0填充: 算数移位:左边移入的位用符号位填充: 3.位置1 :value |= 1<& ...
- MySQL Partition分区扫盲
MySQL从5..3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...
- Eval 表达式 GridView ItemCommand
<asp:TemplateColumn HeaderText="查看审批数据"> <ItemTemplate> <a onclick=& ...
- C# Windows - ListView
ListView控件的属性 属性 说明 Activation 控制用户在列表视图中激活选项的方式Standard - 用户为自己的计算机选择的值OneClick – 单击一个选项,激活它TwoClic ...
- IOS, xib和storyboard的混用--参考
1. 从xib的viewcontroll中启动storyboard 或者 从一个storyboard切换到另一个storyboard: [objc]– (IBAction)openStoryboard ...