Estoy buscando modificar las llamadas ODBC directamente antes de tocar la pila ODBC o entre la pila ODBC y el controlador dll para la conexión que estoy usando. Por ejemplo, si la aplicación hace un SELECCIONAR, quiero poder modificarlo SELECT_ALL ¿Cómo puedo hacer eso?¿Cómo puedo interceptar/reescribir llamadas de Windows ODBC?
Respuesta
La información de configuración de ODBC apunta a la DLL del controlador. Puede reemplazar eso con su propia DLL que tiene los puntos de entrada ODBC. Simplemente haga que todas las que no le interesan sean simples llamadas a la DLL "real". La ejecución y preparación de los puntos de entrada podrían modificar la declaración dada antes de pasarla a la DLL del controlador.
Por ejemplo, si utiliza un DSN de usuario, puede reemplazar el valor en HKCU \ Software \ ODBC.ini \ nombre de origen de datos \ Driver con su propia DLL shim.
Después de googlear un poco, no estoy encontrando un proyecto de shell vacío obvio que sería un punto de partida ideal. El API reference tiene detalles sobre la API. En general, sin embargo, no deberías necesitar información de allí. Solo necesita pasar los parámetros para cada API a la DLL del controlador actual. Los prototipos de funciones se pueden extraer de sql.h
y sqlext.h
.
Un método alternativo que podría ser más sencillo que escribir una shim DLL sería enganchar simplemente las funciones de ejecución y preparación (probablemente solo SQLExecDirect y SQLPrepare). This article es el primer golpe que vi al hacer eso.
- 1. ¿Puedo hacer llamadas ODBC asíncronas? Cualquier material de referencia?
- 2. Configuración de PostgreSQL ODBC en Windows
- 3. Windows C++: ¿Cómo puedo redireccionar stderr para llamadas a fprintf?
- 4. ¿Puedo usar LINQ2SQL con ODBC?
- 5. Llamadas al sistema en Windows
- 6. Formas comunes de conectarse a odbc desde python en Windows?
- 7. ODBC ConnectionString
- 8. 64 bits ODBC Excepción
- 9. ¿Cómo instalo el controlador ODBC "SQL Server"?
- 10. (Windows) Monitoreo de llamadas API en C
- 11. ¿Cómo puedo encontrar llamadas a procedimientos almacenados?
- 12. ¿Cómo puedo encadenar mis llamadas a métodos?
- 13. llamadas multihilo en la aplicación Windows Forms?
- 14. ¿Cómo creo un DSN para ODBC en Linux?
- 15. No puedo acceder a ODBC DB con MS Access2007
- 16. Con VBA, busque la versión del controlador ODBC de MySQL instalado en Windows
- 17. ¿Utiliza la versión de 32 bits de ODBC en Windows 7 de 64 bits?
- 18. Excel ODBC y servidor de 64 bits
- 19. ¿Cómo puedo obtener la pila de llamadas en Clojure?
- 20. ¿Cómo puedo retrasar deliberadamente Windows?
- 21. MySQL odbc timeout from R
- 22. Orden de método Llamadas en un servicio de Windows
- 23. Manera eficiente de probar la conexión ODBC
- 24. ¿Cómo uso el controlador ODBC Java de 64 bits con una base de datos de Access en Windows 2008?
- 25. AppDomain.GetCurrentThreadID vs Thread.ManagedThreadID para llamadas a la API de Windows?
- 26. ¿Cómo puedo extraer el gráfico de llamadas de una función de los archivos fuente de Python?
- 27. Cómo depurar llamadas remotas .NET?
- 28. Cómo desinfectar la entrada de la base de datos ODBC?
- 29. ¿Cómo puedo SECAR todas estas llamadas para renderizar: índice?
- 30. ¿Cómo puedo obtener múltiples llamadas a sem_open trabajando en C?
Gracias por el consejo, había pensado en eso. Traté de hacer una DLL C++ que reenvió todos los métodos exportados, pero no tuve suerte para que funcione. ¿Alguna buena palabra clave para google? Gracias de nuevo. – TwoBitsShort
@Christian: asegúrese de utilizar 'extern" C "' en las exportaciones para que los nombres no se alteren. Puede usar 'dumpbin/exports' en la DLL para asegurarse de que no estén decorados. Examinaré un poco con Google y veré si puedo encontrar algo. Idealmente, sería bueno tener un shell vacío que tenga definidas todas las funciones del punto de entrada. ... Parece que algo de esa naturaleza debería existir. –
@mark: Escaneé con dumpbin y luego usé archivos .def para declarar todas las funciones exportadas. La rutina principal hace una loadlibrary del controlador de odbc original y modifiqué el registro para apuntar a mi shim dll. También probé el enfoque pragma. Cada vez que recibo un aviso de que el controlador no es compatible con el método SQLDirectConnectW. DirectConnectW no está en la tabla de exportación, y es solo una versión unicode de DirectConnect. ¿Algunas ideas? – TwoBitsShort