Estoy tratando de usar JNA para consultar los permisos efectivos para un archivo en Windows. Eventualmente, planeo usar el GetEffectiveRightsFromAcl function, pero para hacerlo, necesito proporcionar un puntero a un TRUSTEE structure poblado. La plataforma JNA (platform.jar) no parece definir esta estructura, así que estoy tratando de definirla yo mismo. Esto es lo que tengo hasta ahora:Conversión de cadena a puntero para JNA
public static class TRUSTEE extends Structure {
public TRUSTEE() {
super();
}
public TRUSTEE(Pointer p) {
super(p);
read();
}
public Pointer pMultipleTrustee;
public int MultipleTrusteeOperation;
public int TrusteeForm;
public int TrusteeType;
public Pointer ptstrName;
}
Estoy tratando de poblar la estructura como esta:
private TRUSTEE createTrusteeForCurrentUser() {
TRUSTEE result = new TRUSTEE();
result.TrusteeForm = TRUSTEE_FORM.TRUSTEE_IS_NAME;
result.TrusteeType = TRUSTEE_TYPE.TRUSTEE_IS_USER;
String strName = "CURRENT_USER";
// How can I set result.ptstrName using strName?
}
This Google Groups thread recomienda el uso de String
campos en las estructuras cuando un char *
se pide. Sin embargo, no creo que esto sea apropiado en mi situación, ya que el campo ptstrName
tiene permitido apuntar a diferentes tipos de cosas, dependiendo del valor de TrusteeForm
. Por lo tanto, creo que de alguna manera necesito convertir de String
a Pointer
en su lugar. Encontré la clase NativeString en JNA, que funcionaría, excepto que es una clase privada de paquete.
¿Cuál es la forma recomendada de convertir un Java String
a un formato nativo y obtener un Pointer
a él? ¿Estoy utilizando el tipo de datos correcto para la estructura TRUSTEE
? Soy algo nuevo para JNA, así que discúlpeme si me falta algo obvio.
actualización
he encontrado una solución a mi problema, pero si alguien tiene una solución mejor todavía me gustaría escucharlo.
Gracias, esta parece ser la forma "correcta" de hacerlo. Una pregunta: ¿por qué no usaste el constructor 1-arg NativeString, en lugar del de 2 arg? – fragorl
@fragorl Para mi aplicación estaba usando cadenas de caracteres anchos (Unicode), así que necesitaba establecer el parámetro 'ancho' en' verdadero'. El constructor 1-arg lo establece en 'falso'. –
Ahh mi mal, estaba buscando la última versión de jna, donde cambiaron el constructor 1-arg. Ahora se lee: this (string, Native.getDefaultStringEncoding()) ;. Pero aquí tienes el código fuente de una versión anterior; por supuesto, tu publicación es de 2012, woops>< – fragorl