Это наблюдение вопрос How to write void pointer typedefs in vapi files?Может ли free_function быть методом статического класса?
теперь у меня есть четыре почти одинаковые [Compact] class
эс, которые представляют собой маркеры, выделенные с unixODBCs SQLAllocHandle
функции.
Первый (для типа ручки ENV) выглядит следующим образом:
[CCode (cname = "void", free_function = "EnvironmentHandle.free")]
[Compact]
public class EnvironmentHandle {
[CCode (cname = "SQLAllocHandle")]
private static Return allocate_internal (HandleType type, void* nothing, out EnvironmentHandle output_handle);
public static Return allocate (out EnvironmentHandle output_handle) {
return allocate_internal (HandleType.ENV, null, out output_handle);
}
[CCode (cname = "SQLFreeHandle")]
private static Return free_internal (HandleType type, EnvironmentHandle handle);
public static Return free (EnvironmentHandle handle) {
return free_internal (HandleType.ENV, handle);
}
}
Это не компилируется.
Можно ли использовать метод статического класса как free_function
?
Если нет, существует ли хотя бы способ написать пользовательский файл free_function
в файле vapi?
Мне нужна пользовательская функция, потому что функция SQLFreeHandle
принимает тип дескриптора и дескриптор в качестве аргумента.
С точки зрения пользователей Вапи все, что действительно важно:
[CCode (cname = "void")]
[Compact]
public class EnvironmentHandle {
public static Return allocate (out EnvironmentHandle output_handle);
}
Единственным решением было бы использовать [SimpleType] struct
как предложено apmasell в оригинальный вопрос. Это скроет тот факт, что SQLHANLDE
действительно ссылочный тип.
Полный код моей текущей реализации доступна на сайте: https://github.com/antiochus/unixodbc-vala/tree/0486f54dc3f86d9c8bf31071980e4f171aca9591