我正在尝试使用 JNA 查询 Windows 中文件的有效权限。最终,我计划使用 GetEffectiveRightsFromAcl function ,但为此,我需要提供一个指向已填充 TRUSTEE structure 的指针. 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;
}
我正在尝试填充这样的结构:
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
字段。但是,我认为这不适合我的情况,考虑到 ptstrName
字段允许指向不同类型的事物,具体取决于 TrusteeForm
的值。所以,我认为我需要以某种方式将 String
转换为 Pointer
。我找到了 NativeString JNA 中的类,它可以工作,除了它是一个包私有(private)类。
将 Java String
转换为 native 格式并获取指向它的 Pointer
的推荐方法是什么?我是否为 TRUSTEE
结构使用了正确的数据类型?我是 JNA 的新手,所以如果我遗漏了一些明显的东西,请原谅。
更新
我找到了解决问题的办法,但如果有人有更好的解决办法,我仍然很想听听。
最佳答案
假设你想在 native 端使用 char *
(如果字符串包含非 ascii 字符,你可能需要分配更多内存),
String myString = "CURRENT_USER";
Pointer m = new Memory(myString.length() + 1); // WARNING: assumes ascii-only string
m.setString(0, myString);
然后,您可以在任何需要引用“ native ”字符串的地方使用 m
。
对于宽字符串(wchar_t *
),
String myString = "CURRENT_USER";
Pointer m = new Memory(Native.WCHAR_SIZE * (myString.length() + 1));
m.setWideString(0, myString);
关于java - 将字符串转换为 JNA 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158582/