深入ADO内部调试

原创 2004年09月13日 11:42:00
        最近在做一个DataGrid链接DBF数据库的工程。DataGrid的数据是ADO Recordset。在操作DBF文件时常常出现ADO内部爆出的错误。这些错误有些很难调试。我们知道ADO是通过OLE DB操作数据库的。这些操作通常都会转化为对数据库的SQL语句。我们如果能知道最终的SQL语句是什么,就对调试有很大帮助。我链接数据库的Connect String 是:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/;Extended Properties=DBASE 5.0"。
查找注册表后得到实现Provider的文件是:msjetoledb40.dll。用Depends工具查看这个文件发现只导出了通常COM都会导出3个接口。它的内部都有什么还是不知道。找到它的符号文件,msjetoledb40.pdb。随便用文本工具打开它,会发现依稀有OLE DB COM借口和函数的影子。用PDBDUMP工具把他的符号导出。这次看得清楚多了!很快找到这样一个符号:SetCommandText@CImpICommandText@@UAGJABU_GUID@@PBG@Z,显然CImpICommandText是实现ICommandText接口的类,如果编写过OLE DB Provider就会知道SetCommandText的第二个参数保存着那个神秘的SQL字符串。好想看看里面是什么!
      接下来要在SetCommandText函数上设断点,这个断点可不好设。看到PDBDUMP的该函数输出上前面有<rva 0x62a0>,rva这不就是偏移地址嘛!赶快开动visual c++ debug程序。打开Moduals窗口,找到msjetoledb40.dll那一项,看看它的载入地址,然后再加上偏移。在这个最终地址上设立断点。运行程序,发现什么也没发生!!!Faint!!!看来那个rva是个冒牌的。没时间去研究PDBDUMP的源码了。只能另取它法。我们有符号,想找到它的内存地址。很简单嘛,突然想起WinDebug了。它有个命令:x 。就是完成这项工作的!只能先用WinDebug了。在WinDebug中打开程序。当msjetoledb.dll已经调入内存后,运行: x msjetoledb!*SetCommandText*。找到的一个就是ICommandText接口SetCommandText的地址。注意一定要把msjetoledb40.pdb装入才能找到呀!拿到这个地址,在VC中设端点,果然断掉了。成功了一半了!打开堆栈窗口,看看是谁调用SetCommandText,在call语句之前,肯定有push 语句,这个函数有两个参数,其中第一个push就是SQL字符串的地址。 突然发现堆栈是错误的。那就打开内存窗口,察看esp,esp指向的值,在断掉的那一刻指向是返回地址,加4是ICommandText实现类的地址,再加4是第一个参数,再加4就是Sql字符串的地址,察看地址的内容,My GOD!他终于出来了!
        试验了一下。当我在DataGrid中修改值后,断点会马上激活,字符串显示果然就是ADO参考书上的“Update "语句。

蛇年最后一篇以及新春之礼:高效开发视频讲座下载

又是一年要过去,在这里不禁感概时间飞逝,不知不觉中近40岁了,好想酸一把。在潜意识中觉得好像自己还是30岁,处于一生中最黄金的阶段。 担心时间飞逝,黄金时间过去就再也不复返,无可追寻。从我的孩子出生,...
  • JoeXiongjin
  • JoeXiongjin
  • 2014年01月28日 19:42
  • 2502

常用但忽略的anroid知识6-深入理解Android中View

这回我们是深入到View内部,去研究View,去了解View的工作,抛弃其他因素,以便为以后能灵活的使用自定义空间打下一定的基础。希望有志同道合的朋友一起来探讨,深入Android内部,深入理解And...
  • u013700636
  • u013700636
  • 2014年12月09日 19:40
  • 462

待毕业.Net码农就业求职储备

声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用。当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的。此外,除了技术...
  • mss359681091
  • mss359681091
  • 2016年07月06日 17:38
  • 479

新手学习树莓派-配置环境,调试

材料: 硬件:树莓派3B,miniUSB,网线,一台笔记本电脑。 软件: 过程:今天拿到了很久以前就想拥有的树莓派,不得不说有点小贵。然后就马不停蹄的开始了树莓派的安装配置工作,不得不得说安装配...
  • HCJooox
  • HCJooox
  • 2016年10月23日 18:52
  • 415

深入 Java 调试体系,第 2 部分: JVMTI 和 Agent 实现

Java 程序的诊断和调试 开发人员对 Java 程序的诊断和调试有许多不同种类、不同层次的需求,这就使得开发人员需要使用不同的工具来解决问题。比如,在 Java 程序运行的过程中,程序员希望掌...
  • guomei
  • guomei
  • 2015年07月01日 01:02
  • 591

ADO读取Excel的简单例子

一、简单说明: 工程名字ADO_Excel,类型是console app, 非empty有预编译头stdafx.h。 编译说明: 1.确保C盘下面路径有msado15.dll,没有安装office2...
  • Blues1021
  • Blues1021
  • 2015年02月04日 12:14
  • 6078

深入理解Spring4框架(二)——容器

ApplicationContext可以被看作Spring的容器,它是继承自BeanFactory的。BeanFactory是访问容器的根接口,提供了必要的配置框架和基础功能,而Application...
  • u012758088
  • u012758088
  • 2016年07月24日 20:46
  • 999

Eclipse调试方法

http://blog.jobbole.com/93421/ 一、Eclipse调试介绍 二、Eclipse中和Debug相关的视图 2.1 Debug View2.2 Variab...
  • jyl1999xxxx
  • jyl1999xxxx
  • 2017年01月01日 17:40
  • 690

深入理解windows内部原理系列--笔记二

CR3寄存器:用来记录页目录表的物理基地址的寄存器,简称PDBR(page directory base register)   切换CR3寄存器意味着切换地址空间   不同进程拥有不同的地址...
  • yalecaltech
  • yalecaltech
  • 2017年04月28日 22:34
  • 348

Windows下C++访问数据库(ADO)

C++利用ADO访问数据库还是比较方便的,我参考网上其它资料把ADO到一个类中,这样调用起来会更加的方便 这个类单线程访问数据库没有问题,提供了查询、增加、删除和修改的接口。 并行访问的话会有...
  • luke2834
  • luke2834
  • 2015年08月19日 12:07
  • 1847
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入ADO内部调试
举报原因:
原因补充:

(最多只允许输入30个字)