Chcę zmodyfikować wywołania ODBC bezpośrednio przed naciśnięciem stosu ODBC lub między stosem ODBC a sterownikiem dll dla połączenia, którego używam. Na przykład, jeśli aplikacja wykonuje polecenie SELECT, chcę go zmodyfikować na SELECT_ALL. Jak mogę to zrobić?Jak mogę przechwytywać/przepisywać połączenia ODBC systemu Windows?
Odpowiedz
Informacje o konfiguracji ODBC wskazują na DLL sterownika. Można go zastąpić własną biblioteką DLL z punktami wejścia ODBC. Po prostu spraw, aby wszystkie te, których nie obchodzi, były zwykłymi połączeniami z "prawdziwą" biblioteką DLL. Wykonanie i przygotowanie punktów początkowych może zmodyfikować podaną instrukcję przed przekazaniem jej do biblioteki DLL sterownika.
Na przykład, jeśli używasz DSN użytkownika, możesz zastąpić wartość w HKCU \ Software \ ODBC.ini \ datasourcename \ Driver własną biblioteką shim.
Po odrobinie wyszukiwania google nie znajduję oczywistego projektu pustej powłoki, który byłby idealnym punktem wyjścia. Numer API reference zawiera informacje o interfejsie API. Ogólnie rzecz biorąc, nie powinieneś naprawdę potrzebować tam informacji. Trzeba tylko przekazać parametry dla każdego interfejsu API do biblioteki DLL sterownika. Prototypy funkcji można wyodrębnić z sql.h
i sqlext.h
.
Alternatywną metodą, która może być łatwiejsza niż pisanie biblioteki shim DLL, jest podpięcie tylko funkcji wykonywania i przygotowania (prawdopodobnie tylko SQLExecDirect i SQLPrepare). This article to pierwsze trafienie, które zobaczyłem.
Dzięki za radę, pomyślałem o tym. Próbowałem zrobić DLL C++, który przekazał wszystkie wyeksportowane metody, ale nie miał szczęścia, aby to zadziałało. Jakieś dobre słowa kluczowe do google? Dzięki jeszcze raz. – TwoBitsShort
@Christian: Upewnij się, że używasz 'extern" C "' w eksporcie, aby nazwy nie były zniekształcone. Możesz użyć 'dumpbin/exports' na DLL, aby upewnić się, że nie są one udekorowane. Pokłębię się trochę z Google i zobaczę, czy coś mogę znaleźć. Najlepiej byłoby uzyskać pustą powłokę, która ma zdefiniowane wszystkie funkcje punktu wejścia. ... Wygląda na to, że coś takiego powinno istnieć. –
@mark: Zeskanowałem za pomocą dumpbin, a następnie użyłem plików .def, aby zadeklarować wszystkie wyeksportowane funkcje. Główna rutyna wykonuje loadlibrary sterownika orig odbc i zmieniłem rejestr tak, aby wskazywało na moją bibliotekę shim. Próbowałem także podejścia pragma. Za każdym razem dostaję informację, że sterownik nie obsługuje metody SQLDirectConnectW. DirectConnectW nie znajduje się w tabeli eksportu i jest tylko wersją DirectConnect w standardzie Unicode. Jakieś pomysły? – TwoBitsShort