2011-02-07 120 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