使用指针

时间:2016-04-16 18:03:06

标签: c swift

鉴于以下 ODBC C API 信息和关联的类型定义,如何从 swift 调用 SQLSetEnvAttr 函数?

swift ,我的代码成功调用先决条件 SQLAllocHandle 函数,该函数提供后续使用的环境句柄( henv ) strong> SQLSetEnvAttr 函数调用。
我尝试了各种方法,包括 UnsafeMutablePointer ,试图遵循以下网站上引用的指令,但我无法弄清楚如何让编译器允许我从 Void转换* SQLPOINTER (即使它被定义为相同的东西)。另外,我对如何使 UnsafeMutablePointer 指向我使用的 CUnsignedLong 变量( SQL_OV_ODBC3 typedef)的值感到困惑(设置为 3

ODBC API

typedef signed short int SQLSMALLINT;
typedef SQLSMALLINT     SQLRETURN;
typedef void *          SQLPOINTER;
#define SQL_ATTR_ODBC_VERSION               200
#define SQL_OV_ODBC3                        3UL

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
             (SQLPOINTER) SQL_OV_ODBC3, 0);

使我能够处理环境的 swift 代码是:

var sqlHenvPtr : UnsafeMutablePointer<SQLHENV> = UnsafeMutablePointer<SQLHENV>.alloc(1) var retcode : CShort = SQLAllocHandle(Int16(SQL_HANDLE_ENV), nil, sqlHenvPtr)

寻求有关如何定义和传递第三个参数的帮助:

let SQL_ATTR_ODBC_VERSION : Int32 = 200
retcode = SQLSetEnvAttr(sqlHenvPtr.memory, SQL_ATTR_ODBC_VERSION, ???, 0)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

根据Chris的反馈更新

let value = UnsafeMutablePointer<Void>(bitPattern: 3)
SQLSetEnvAttr(0, 0, value, 0)

SQLSetEnvAttr()的预期值为 0x3 (在您的情况下为 0x10025a478 )。我验证了我自己的接受 SQLPOINTER 的原型C函数在建议的方式准备第3个参数的情况下接收 0x3 。希望现在有所帮助。