2010-06-18 37 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