2010-06-18 97 views
5

我正在修改ODBC调用,直接在打开ODBC堆栈之前,或者在ODBC堆栈和我正在使用的连接的dll驱动程序之间。例如,如果应用程序执行SELECT操作,我希望能够将其修改为SELECT_ALL我该怎么做?如何拦截/重写Windows ODBC调用?

回答

1

ODBC安装信息指向驱动程序DLL。您可以用您自己的具有ODBC入口点的DLL来替换它。简单地将所有你不关心的内容简单地称为“真正的”DLL。执行并准备入口点可以在将给定语句传递给驱动程序DLL之前修改它。

例如,如果使用用户DSN,则可以用您自己的shim DLL替换HKCU \ Software \ ODBC.ini \ datasourcename \ Driver中的值。

经过一番谷歌搜索之后,我没有找到一个明显的空壳项目,这将是一个理想的起点。 API reference有关于API的详细信息。但总的来说,你不应该真的需要从那里获得信息。您只需将每个API的参数传递给实际驱动程序DLL即可。函数原型可以从sql.hsqlext.h中提取。

另一种可能比编写shim DLL更简单的方法是只钩住execute和prepare函数(可能只是SQLExecDirect和SQLPrepare)。 This article是我看到的第一次打击。

+0

感谢您的建议,我曾考虑过这个问题。我试图做一个C++ DLL来转发所有导出的方法,但没有运气让它工作。任何好的关键字谷歌?再次感谢。 – TwoBitsShort 2010-06-18 05:50:56

+0

@Christian:确保在导出时使用'extern“C”',这样名称就不会被损坏。你可以在DLL上使用'dumpbin/exports'来确保它们没有被修饰。我会与谷歌一起探讨一下,看看我能否找到一些东西。理想情况下,获得一个定义了所有入口点函数的空壳是很好的。 ...似乎应该存在这种性质的东西。 – 2010-06-18 13:03:05

+0

@mark:我使用dumpbin进行扫描,然后使用.def文件声明所有导出的函数。主例程做一个原始的odbc驱动程序的loadlibrary,我改变了注册表以指向我的shim dll。我也尝试了杂注方法。每次我收到驱动程序不支持SQLDirectConnectW方法的通知时。 DirectConnectW不在导出表中,它只是DirectConnect的Unicode版本。有任何想法吗? – TwoBitsShort 2010-06-20 23:28:39