Sto tentando di utilizzare JNA per interrogare le autorizzazioni effettive per un file in Windows. Alla fine, prevedo di utilizzare lo GetEffectiveRightsFromAcl function, ma per farlo, ho bisogno di fornire un puntatore a uno spazio popolato da TRUSTEE structure. La piattaforma JNA (platform.jar) non appare definire questa struttura, quindi sto provando a definirlo io stesso. Ecco quello che ho finora:Conversione da stringa a puntatore per 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;
}
Sto cercando di popolare la struttura come questa:
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 raccomanda utilizzando String
campi in strutture quando un char *
è richiesto. Tuttavia, non ritengo che questo sia appropriato nella mia situazione, considerando che il campo ptstrName
può indicare diversi tipi di cose, a seconda del valore di TrusteeForm
. Quindi, penso che in qualche modo ho bisogno di convertire da String
a Pointer
invece. Ho trovato la classe NativeString in JNA, che avrebbe funzionato, tranne che si trattava di una classe privata del pacchetto.
Qual è il modo consigliato per convertire un Java String
in un formato nativo e ottenere un Pointer
ad esso? Sto anche usando il giusto tipo di dati per la struttura TRUSTEE
? Sono un po 'nuovo a JNA, quindi scusami se mi manca qualcosa di ovvio.
Aggiornamento
ho trovato una soluzione al mio problema, ma se qualcuno ha una soluzione migliore mi piace ancora di sentirlo.
Grazie, questo sembra essere il modo "corretto" per farlo. Una domanda: perché non hai usato il costruttore NativeString 1-arg invece di quello 2-arg? – fragorl
@fragorl Per la mia applicazione stavo usando stringhe wide-character (Unicode), quindi ho dovuto impostare il parametro 'wide' su' true'. Il costruttore 1-arg lo imposta su 'false'. –
Ah mio mal, stavo guardando l'ultima versione di jna, dove hanno cambiato il costruttore 1-arg. Ora legge: this (string, Native.getDefaultStringEncoding()) ;. Ma qui hai il codice sorgente per una versione precedente - ovviamente, il tuo post è del 2012, woops>< – fragorl