java - 将字符串转换为 JNA 的指针

标签 java winapi jna

我正在尝试使用 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/

相关文章:

java - 无法理解以下程序的行为(使用 java 集合)

c++ - 使用 CreateFile 打开网络文件失败并显示 FILE_NOT_FOUND

java - JNA Win32 获取JInternalFrame的标题

java - "The crash happened outside the Java Virtual Machine in native code."如何解决这个错误(Java)?

java - 使用 apache VFS 创建虚拟文件系统

java - Java如何保证ListenableFuture中future.isDone()时回调被调用

java - 与 concat 一起使用时,字符串池的行为会有所不同吗?

c++ - 如何加载另一个进程的窗口作为子窗口?

C++ WinAPI TextOut() 更新文本

cassandra - 为什么在 Cassandra 启动时仍然出现 JNA 错误,即使 jna.jar 和 platform.jar 都在 lib 目录中?