ODBC 测试未调用我的 odbc api 函数

My odbc api functions does not get called from ODBC Test

在过去的几周里,我一直在努力实现自定义 odbc 函数。 这就是我所在的地方。 我设法实现了设置功能,一切正常。我可以创建 DSN,它会调用我的 ConfigDSN 函数,它会在 ODBC.INI 下的注册表中注册我的 ODBC,它会设置指向我的 customOdbcApi.dll.

的驱动程序键和值

问题是当我尝试连接到我的 DSN 时,它没有调用任何函数,例如 SQLConnect。

这是我尝试连接到 "AiPandaOdbc" 时得到的响应

但是在我的函数中,我实现了一个应该弹出的消息对话框,我从函数中 return 0 not -2

到目前为止我检查的内容:

注册表中的路径正确,它指向 odbcDriver.dll

我添加了 .def 文件,在其中添加了我想要导出的所有函数。

唯一有趣的是,如果我在 DllMain 中调用 MessageBox,则会显示消息框,因此我的 dll 已 100% 被识别。

我缺少或忘记添加什么以便调用我的函数?

编辑: 我也尝试过控制台应用程序,但仍然没有,SQLAllocHandle returns 0 但 SQLConnect returns -1

编辑 2:

我添加了#undef UNICODE,所以我确保他调用的是SQLConnect 而不是SQLConnectW。但问题依然存在。我的 SQLConnect 仍然没有被调用。

<html>

    <head></head>

    <body>
        <h1>ODBC TRACE LOG</h1>

        <textarea style="width:90%;height:900px;">
            
ConsoleApplicat 3120-6500 ENTER SQLAllocHandle 
SQLSMALLINT                  1 <SQL_HANDLE_ENV>
SQLHANDLE           0x00000000
SQLHANDLE *         0x00A5C138

ConsoleApplicat 3120-6500 EXIT  SQLAllocHandle  with return code 0 (SQL_SUCCESS)
SQLSMALLINT                  1 <SQL_HANDLE_ENV>
SQLHANDLE           0x00000000
SQLHANDLE *         0x00A5C138 ( 0x00DD7938)

ConsoleApplicat 3120-6500 ENTER SQLSetEnvAttr 
SQLHENV             0x00DD7938
SQLINTEGER                 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER                 3 <SQL_OV_ODBC3>
SQLINTEGER                   0 

ConsoleApplicat 3120-6500 EXIT  SQLSetEnvAttr  with return code 0 (SQL_SUCCESS)
SQLHENV             0x00DD7938
SQLINTEGER                 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER                 3 <SQL_OV_ODBC3>
SQLINTEGER                   0 

ConsoleApplicat 3120-6500 ENTER SQLAllocHandle 
SQLSMALLINT                  2 <SQL_HANDLE_DBC>
SQLHANDLE           0x00DD7938
SQLHANDLE *         0x00A5C13C

ConsoleApplicat 3120-6500 EXIT  SQLAllocHandle  with return code 0 (SQL_SUCCESS)
SQLSMALLINT                  2 <SQL_HANDLE_DBC>
SQLHANDLE           0x00DD7938
SQLHANDLE *         0x00A5C13C ( 0x00DD79B8)

ConsoleApplicat 3120-6500 ENTER SQLConnectW 
HDBC                0x00DD79B8
WCHAR *             0x00DD04D0 [      -3] "AiPandaODBC\ 0"
SWORD                       -3 
WCHAR *             0x73382440 [      -3] "******\ 0"
SWORD                       -3 
WCHAR *             0x73382440 [      -3] "******\ 0"
SWORD                       -3 

ConsoleApplicat 3120-6500 EXIT  SQLConnectW  with return code -1 (SQL_ERROR)
HDBC                0x00DD79B8
WCHAR *             0x00DD04D0 [      -3] "AiPandaODBC\ 0"
SWORD                       -3 
WCHAR *             0x73382440 [      -3] "******\ 0"
SWORD                       -3 
WCHAR *             0x73382440 [      -3] "******\ 0"
SWORD                       -3 

DIAG [IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0) 

ConsoleApplicat 3120-6500 ENTER SQLFreeHandle 
SQLSMALLINT                  1 <SQL_HANDLE_ENV>
SQLHANDLE           0x00A5C138

ConsoleApplicat 3120-6500 EXIT  SQLFreeHandle  with return code -2 (SQL_INVALID_HANDLE)
SQLSMALLINT                  1 <SQL_HANDLE_ENV>
SQLHANDLE           0x00A5C138

ConsoleApplicat 3120-6500 ENTER SQLFreeHandle 
SQLSMALLINT                  2 <SQL_HANDLE_DBC>
SQLHANDLE           0x00A5C13C

ConsoleApplicat 3120-6500 EXIT  SQLFreeHandle  with return code -2 (SQL_INVALID_HANDLE)
SQLSMALLINT                  2 <SQL_HANDLE_DBC>
SQLHANDLE           0x00A5C13C

        </textarea>
    </body>
</html>

出于某种原因,即使我输入了#undef UNICODE,他仍然调用 SQLConnectW

编辑 - 我尝试添加 SQLConnectW 函数并导出它,但仍然没有。

要么调用 SQLConnectW 并传递实际的 SQLWCHAR DSN 字符串,要么调用 SQLConnectA 显式调用 ANSI 函数,要么在构建代码时取消定义 UNICODE(将 #undef UNICODE 添加到源代码顶部)以防止对 SQLConnect 的调用被悄悄地调用映射到 SQLConnectW。

我猜您将强制转换添加到 SQLWCHAR* 以防止编译器抱怨,这是 SQLConnect 未被调用的线索。

我设法解决了。我实现了所有功能并且有效