ODBC 스택을 사용하기 전에 직접 또는 ODBC 스택과 사용중인 연결의 dll 드라이버간에 ODBC 호출을 수정하려고합니다. 예를 들어, 응용 프로그램이 SELECT를 수행하는 경우 SELECT_ALL을 수정할 수 있어야합니다. 어떻게 할 수 있습니까?Windows ODBC 호출을 가로 채고 다시 쓸 수 있습니까?
5
A
답변
1
ODBC 설치 정보는 드라이버 DLL을 가리 킵니다. ODBC 엔트리 포인트가있는 자신의 DLL로 대체 할 수 있습니다. 간단히 "진짜"DLL에 대한 간단한 호출이 아니라 상관하지 않는 모든 것을 만드십시오. execute 및 prepare 진입 점은 드라이버 DLL에 전달하기 전에 주어진 문을 수정할 수 있습니다.
예를 들어 사용자 DSN을 사용하는 경우 HKCU \ Software \ ODBC.ini \ datasourcename \ Driver의 값을 사용자 자신의 shim DLL로 바꿀 수 있습니다.
약간의 인터넷 검색 후, 이상적인 출발점이 될 명백한 빈 쉘 프로젝트를 찾지 못했습니다. API reference에는 API에 대한 세부 정보가 있습니다. 그러나 일반적으로 정보는 필요 없습니다. 각 API에 대한 매개 변수를 actuall 드라이버 DLL에 전달하면됩니다. 함수 프로토 타입은 sql.h
및 sqlext.h
에서 추출 할 수 있습니다.
shim DLL을 작성하는 것보다 쉬운 다른 방법은 실행 및 준비 함수 (아마도 SQLExecDirect 및 SQLPrepare)를 연결하는 것입니다. This article은 내가 그 일을 처음 본 적중입니다.
조언을 주셔서 감사합니다. 나는 그것에 대해 생각해 보았습니다. 내 보낸 된 모든 메서드를 전달하는 C++ DLL 할려고했지만 운 좋게 작동하도록 가져 오지 못했습니다. google에 어떤 좋은 키워드? 다시 한번 감사드립니다. – TwoBitsShort
@Christian : 내보내기에'extern "C"'를 사용하여 이름이 엉망이되지 않도록해야합니다. DLL에'dumpbin/exports'를 사용하여 장식되지 않았는지 확인할 수 있습니다. 나는 약간의 주위에 구글을 찌를 것이고, 내가 뭔가를 찾을 수 있는지 알 것이다. 모든 엔트리 포인트 함수가 정의 된 빈 쉘을 얻는 것이 이상적입니다. ... 그 자연의 무언가가 존재해야하는 것처럼 보입니다. –
@mark : dumpbin으로 스캔 한 다음 .def 파일을 사용하여 내 보낸 모든 함수를 선언했습니다. 주 루틴은 원래 ODBC 드라이버의 loadlibrary를 수행하고 shim dll을 가리 키도록 레지스트리를 변경했습니다. 나는 또한 프라그 마 접근법을 시도했다. 드라이버가 SQLDirectConnectW 메서드를 지원하지 않는다는 통지를받을 때마다. DirectConnectW는 내보내기 테이블에 없으며 DirectConnect의 유니 코드 버전입니다. 어떤 아이디어? – TwoBitsShort