2011-02-07 206 views
0

在我需要包装的DLL的头文件中使用BSTR数据类型作为I/O参数。我需要在JNA中创建它的映射。我已经发现下面的例子:JNA中BSTR数据类型的映射

class BSTR extends PointerType { 
    public BSTR() { } 
    public BSTR(String value) { 
    super(new Memory(value.length()*2+6).share(4)); 
    getPointer().setInt(-4, value.length()*2); 
    getPointer().setString(0, value, true); 
} 
public String toString() { 
    int length = getPointer().getInt(-4); 
    char[] data = getPointer().getCharArray(0, length/2); 
    return new String(data); 
} 

}

但使用它在JNA方法调用之后的结果是空的(=长度为0并且没有数据)。你有任何建议如何创建正确的映射为BSTR使用它作为I/O参数的功能?它看起来像BSTR没有通过引用DLL方法传递,所以结果仍然是空的,但它只是我的假设。也许映射是正确的,但在方法调用中被错误地使用。提前感谢您的任何建议。

回答

0

我找不到一个正确的“Type for Type”映射,但可以肯定的是,您可以这样试试并获取一个字符串(长度> 0)。

[编辑:看Technomage评论]
注意:你应该是多少 使用 Memory对象时更加小心。当java对象收集garbadge时,它们会在本机级别释放。这意味着你的代码 super(new Memory(value.length()*2+6).share(4));只是在浪费时间,因为你 new Memory(..)消失的那一刻,你通过线后,因为 .share(4)给出一个新的独立的 Pointer

class BSTRUtils { 
    private BSTR() { } 
    public static Memory toNative(String value) { 
    Memory m = new Memory(value.length()*2+6); 
    m.setInt(0, value.length()*2); 
    m.setString(4, value, true); 
    return m; 
    } 
    public static String toString(PointerByReference pbr) { 
    return toString(pbr.getValue()); 
    } 
    public static String toString(Pointer p) { 
    int length = p.getInt(0); 
    char[] data = p.getCharArray(4, length/2); 
    return new String(data); 
    } 
} 
+1

的Memory.share()调用创建一个内部类SharedMemory实例,它具有对原始Memory对象的隐式引用。所以ctor中的原始用法没有任何问题。 – technomage 2011-12-11 13:51:23