gpt4 book ai didi

binding - 如何在 vapi 文件中写入 void pointer typedefs?

转载 作者:行者123 更新时间:2023-12-04 02:44:54 25 4
gpt4 key购买 nike

我正在尝试编写一个 VAPI 文件以使用 unixODBC,其中一个函数称为 SQLAllocHandle:

// From <sqltypes.h>
#define SQL_API
typedef signed short int SQLSMALLINT;
typedef SQLSMALLINT SQLRETURN;
typedef void * SQLHANDLE;

// From <sql.h>
#define SQL_SUCCESS 0
#define SQL_SUCCESS_WITH_INFO 1
#define SQL_ERROR (-1)
#define SQL_INVALID_HANDLE (-2)

#define SQL_HANDLE_ENV 1
#define SQL_HANDLE_DBC 2
#define SQL_HANDLE_STMT 3
#define SQL_HANDLE_DESC 4

#define SQL_NULL_HANDLE 0

SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle);

这是我第一次尝试编写 vapi 文件,但目前文档很少(Vala vapi files documentation)。

调用代码应该类似于:

using UnixOdbc;

int main(string[] args) {
Handle h;
if (AllocHandle (HandleType.ENV, NullHandle, out h) == Return.SUCCESS)
...
}

特别是我想知道如何转换 SQLHANDLE 类型,它实际上只是一个 void *(不透明的 void 指针)。

换句话说,UnixOdbc.Handle 类型在 vapi 文件中是什么样的?

我目前的做法是假装它是一个长的:

[CCode (cheader_filename = "sql.h, sqltypes.h")]
namespace UnixOdbc {
[CCode (cname = "SQLRETURN", cprefix = "SQL_")]
public enum Return {
SUCCESS,
SUCCESS_WITH_INFO,
ERROR,
INVALID_HANDLE
}
[CCode (cname = "SQLSMALLINT", cprefix = "SQL_HANDLE_")]
public enum HandleType {
ENV,
DBC,
STMT,
DESC
}
[CCode (cname = "SQLHANDLE")]
public struct Handle: long {}

[CCode (cname = "SQL_NULL_HANDLE")]
public const Handle NULL_HANDLE;

[CCode (cname = "SQLAllocHandle")]
public static Return AllocHandle (HandleType handle_type, Handle input_handle, out Handle output_handle);
}

最佳答案

您可以尝试阅读 guide for legacy VAPI files .我会:

[CCode(cname = "void")]
[Compact]
public class Handle {
[CCode(cname = "SQLAllocHandle")]
public static Return alocate_handle(HandleType type, Handle? input_handle, out Handle? output_handle);
...
}

简单地忽略SQL_NULL_HANDLE的绑定(bind);它没有做任何有用的事情。

关于binding - 如何在 vapi 文件中写入 void pointer typedefs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19032636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com