2010-06-18 7 views
5

Ich freue mich, ODBC-Aufrufe entweder direkt vor dem ODBC-Stack oder zwischen dem ODBC-Stack und dem DLL-Treiber für die Verbindung, die ich verwende, zu ändern. Zum Beispiel, wenn die Anwendung eine SELECT, ich möchte in der Lage sein, es zu ändern SELECT_ALL Wie kann ich das tun?Wie kann ich Windows ODBC-Aufrufe abfangen/umschreiben?

Antwort

1

Die ODBC-Setup-Informationen verweisen auf die Treiber-DLL. Sie können das durch Ihre eigene DLL ersetzen, die über die ODBC-Einstiegspunkte verfügt. Machen Sie einfach alle, die Ihnen egal sind, einfache Aufrufe an die "echte" DLL. Die Eintrittspunkte "execute" und "prepared" können die angegebene Anweisung ändern, bevor sie an die Treiber-DLL übergeben wird.

Wenn Sie beispielsweise einen Benutzer-DSN verwenden, können Sie den Wert in HKCU \ Software \ ODBC.ini \ Datenquellenname \ Driver durch Ihre eigene Shim-DLL ersetzen.

Nach ein bisschen Googeln finde ich kein offensichtliches leeres Shell-Projekt, das ein idealer Ausgangspunkt wäre. Die API reference enthält Details über die API. Im Allgemeinen sollten Sie jedoch keine Informationen von dort benötigen. Sie müssen lediglich die Parameter für jede API an die tatsächliche Treiber-DLL übergeben. Die Funktionsprototypen konnten aus sql.h und sqlext.h extrahiert werden.

Eine alternative Methode, die einfacher als das Schreiben einer Shim-DLL wäre, wäre, nur die Funktionen execute und prepare zu haken (wahrscheinlich nur SQLExecDirect und SQLPrepare). This article ist der erste Treffer, den ich dabei sah.

+0

Danke für den Rat, ich hatte darüber nachgedacht. Ich habe versucht, eine C++ - DLL zu erstellen, die alle exportierten Methoden weiterleitete, hatte aber kein Glück, dass es funktionierte. Irgendwelche guten Schlüsselwörter zum Google? Danke noch einmal. – TwoBitsShort

+0

@Christian: Stellen Sie sicher, dass Sie "extern" C "für die Exporte verwenden, damit die Namen nicht verändert werden. Sie können 'dumpbin/exports' in der DLL verwenden, um sicherzustellen, dass sie nicht dekoriert sind. Ich werde ein wenig mit Google herumstöbern und sehen, ob ich etwas finden kann. Idealerweise wäre es nett, eine leere Shell zu erhalten, die alle definierten Eingangspunkte hat. ... Scheint, als müsste etwas von dieser Art existieren. –

+0

@mark: Ich habe mit Dumpbin gescannt und dann .def Dateien verwendet, um alle exportierten Funktionen zu deklarieren. Die Hauptroutine führt eine Load-Library des orig odbc-Treibers aus und ich ändere die Registrierung, um auf meine Shim-DLL zu zeigen. Ich habe auch den Pragma-Ansatz ausprobiert. Jedes Mal bekomme ich eine Meldung, dass der Treiber die Methode SQLDirectConnectW nicht unterstützt. DirectConnectW ist nicht in der Exporttabelle und ist nur eine Unicodeversion von DirectConnect. Irgendwelche Ideen? – TwoBitsShort

Verwandte Themen