将字符串转换为JNA的指针

Kev*_*n K 5 java winapi jna

我正在尝试使用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主题建议Stringchar *调用a时使用结构中的字段.但是,我不认为这在我的情况下是合适的,考虑到ptstrName允许字段指向不同类型的事物,取决于值TrusteeForm.所以,我想我不知何故需要转换StringPointer.我在JNA中找到了NativeString类,它可以工作,除了它是一个包私有类.

将Java转换String为本机格式并获取Pointer到它的推荐方法是什么?我甚至为TRUSTEE结构使用正确的数据类型?我对JNA有些新意,所以如果我错过了一些明显的东西,请原谅.

更新

我找到了解决问题的方法,但如果有人有更好的解决方案,我仍然希望听到它.

tec*_*age 9

假设您希望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)