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
으로 변환해야한다고 생각합니다. JNA에서 NativeString 클래스를 발견했습니다. 이는 패키지 개인 클래스를 제외하고는 작동합니다.
Java String
을 기본 형식으로 변환하고 Pointer
을 얻으려면 어떻게하는 것이 좋습니까? 구조체 TRUSTEE
에 올바른 데이터 형식을 사용하고 있습니까? 나는 JNA에게 약간 새로운 편이어서 뭔가 분명하지 않은 점이 있으면 실례합니다.
업데이트
나는 내 문제에 대한 해결책을 찾았지만 사람이 더 나은 솔루션이 있다면 나는 아직도 그것을 듣고 싶습니다.
감사합니다.이 방법은 올바른 방법입니다. 한 가지 질문 - 왜 2-arg one 대신에 1-arg NativeString 생성자를 사용하지 않았습니까? – fragorl
@fragorl 제 응용 프로그램에서 와이드 문자 (유니 코드) 문자열을 사용하고 있었기 때문에'wide' 매개 변수를'true'로 설정해야했습니다. 1-arg 생성자는이를 'false'로 설정합니다. –
Ahh, 나는 jna의 최신 버전을보고 있었는데, 그들은 1-arg 생성자를 변경했다. 이제 읽습니다. this (string, Native.getDefaultStringEncoding()) ;. 그러나 여기에는 이전 버전의 소스 코드가 있습니다. 물론 2012 년 게시물이 있습니다. < – fragorl