Tôi đang cố gắng sử dụng JNA để truy vấn các quyền có hiệu lực đối với tệp trong Windows. Cuối cùng, tôi có kế hoạch sử dụng GetEffectiveRightsFromAcl function, nhưng để làm như vậy, tôi cần phải cung cấp một con trỏ đến một số TRUSTEE structure được điền. Nền tảng JNA (platform.jar) không xuất hiện xác định cấu trúc này, vì vậy tôi đang cố gắng tự định nghĩa nó. Dưới đây là những gì tôi có cho đến nay:Chuyển đổi chuỗi thành con trỏ cho 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;
}
Tôi đang cố gắng để cư cấu trúc như thế này:
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 khuyến cáo sử dụng String
trường trong cấu trúc khi một char *
được gọi là cho. Tuy nhiên, tôi không nghĩ điều này là phù hợp trong trường hợp của tôi, xem xét trường ptstrName
được phép trỏ đến các loại nội dung khác nhau, tùy thuộc vào giá trị của TrusteeForm
. Vì vậy, tôi nghĩ rằng bằng cách nào đó tôi cần phải chuyển đổi từ String
thành Pointer
thay thế. Tôi tìm thấy các lớp học NativeString trong JNA, mà sẽ làm việc, ngoại trừ đó là một lớp gói riêng.
Cách được khuyến nghị để chuyển đổi Java String
thành định dạng gốc và nhận được Pointer
cho nó là gì? Tôi thậm chí có sử dụng đúng kiểu dữ liệu cho cấu trúc TRUSTEE
không? Tôi hơi mới với JNA, vì vậy xin vui lòng tha thứ cho tôi nếu tôi đang thiếu một cái gì đó hiển nhiên.
Cập nhật
Tôi tìm thấy một giải pháp cho vấn đề của tôi, nhưng nếu có ai có một giải pháp tốt hơn tôi vẫn muốn nghe nó.
Cảm ơn, điều này có vẻ là cách "đúng" để thực hiện. Một câu hỏi - tại sao bạn không sử dụng 1-arg NativeString constructor, thay vì 2 arg? – fragorl
@fragorl Đối với ứng dụng của tôi, tôi đã sử dụng các chuỗi ký tự rộng (Unicode), vì vậy tôi cần thiết lập tham số 'wide' thành' true'. Nhà xây dựng 1-arg đặt nó thành 'false'. –
Ahh xấu của tôi, tôi đã nhìn vào phiên bản mới nhất của jna, nơi họ thay đổi 1-arg constructor. Nó bây giờ đọc: này (chuỗi, Native.getDefaultStringEncoding()) ;. Nhưng bạn đã có mã nguồn cho một phiên bản cũ hơn - tất nhiên, bài đăng của bạn là từ năm 2012, các vòng lặp>< – fragorl