我正在尝试使用JNA来查询Windows中文件的有效权限.最后,我打算使用GetEffectiveRightsFromAcl功能,但要做到这一点,我需要提供一个指向填充受托人结构.JNA平台(platform.jar)似乎没有定义这个结构,所以我试图自己定义它.这是我到目前为止所拥有的:
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;
}
Run Code Online (Sandbox Code Playgroud)
我试图填充这样的结构:
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?
}
Run Code Online (Sandbox Code Playgroud)
此Google Groups主题建议String在char *调用a时使用结构中的字段.但是,我不认为这在我的情况下是合适的,考虑到ptstrName允许字段指向不同类型的事物,取决于值TrusteeForm.所以,我想我不知何故需要转换String为Pointer.我在JNA中找到了NativeString类,它可以工作,除了它是一个包私有类.
将Java转换String为本机格式并获取Pointer到它的推荐方法是什么?我甚至为TRUSTEE结构使用正确的数据类型?我对JNA有些新意,所以如果我错过了一些明显的东西,请原谅.
更新
我找到了解决问题的方法,但如果有人有更好的解决方案,我仍然希望听到它.
假设您希望char *在本机端(如果字符串包含非ascii字符,则可能需要分配更多内存),
String myString = "CURRENT_USER";
Pointer m = new Memory(myString.length() + 1); // WARNING: assumes ascii-only string
m.setString(0, myString);
Run Code Online (Sandbox Code Playgroud)
然后,您可以m在需要的任何地方使用它来引用"本机"字符串.
对于宽字符串(wchar_t *),
String myString = "CURRENT_USER";
Pointer m = new Memory(Native.WCHAR_SIZE * (myString.length() + 1));
m.setWideString(0, myString);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14057 次 |
| 最近记录: |