JNAを使用して、Windowsのファイルの有効なアクセス許可を照会しようとしています。最終的にはGetEffectiveRightsFromAcl functionを使用する予定ですが、そのためには、移植されたTRUSTEE structureへのポインタを提供する必要があります。 JNAプラットフォーム(platform.jar)はこの構造体を定義していないので、代わりに自分自身で定義しようとしています。私はこのような構造を移入しようとしている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;
}
:ここで私がこれまで持っているものだ
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がchar *
がために呼び出されたときの構造でString
フィールドを使用することをお勧めします。しかし、TrusteeForm
の値に応じて、ptstrName
フィールドがさまざまな種類のものを指すことが許可されていることを考慮すると、これは私の状況では適切ではないと私は考えています。だから、私は何とかString
からPointer
に変換する必要があると思う。私はNativeStringクラスがJNAにあることを発見しました。パッケージプライベートクラス以外は動作します。
Java String
をネイティブフォーマットに変換してPointer
を取得するには、どのような方法が推奨されますか?私はTRUSTEE
構造体に正しいデータ型を使用していますか?私はJNAに若干新しくなっていますので、何か明白でないものがあれば私には容赦してください。
更新
は、私は私の問題の解決策を見つけましたが、誰もがよりよい解決策を持っている場合、私はまだそれを聞きたいと思います。
ありがとう、これはそれを行うための "正しい"方法と思われる。 1つの質問 - 2-argの代わりに1-arg NativeStringコンストラクタを使用しなかったのはなぜですか? – fragorl
@fragorl私のアプリケーションではワイド文字(Unicode)文字列を使用していたので、 'wide'パラメータを' true'に設定する必要がありました。 1-argコンストラクタは、それを 'false'に設定します。 –
ああ、私は1-argコンストラクタを変更したjnaの最新バージョンを見ていました。これで、this(string、Native.getDefaultStringEncoding());が読み込まれます。しかし、ここには古いバージョンのソースコードがあります。もちろん、あなたの投稿は2012年のものです。< – fragorl