2011-02-07 20 views
0

DLLのヘッダファイルには、I/OパラメータとしてBSTRデータ型を使用する必要があります。 JNAでマッピングを作成する必要があります。 Iは、例えば、以下を見出した: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でないデータです)。関数のI/OパラメータとしてBSTRを使用するための正しいマッピングを作成する方法をお教えください。 BSTRはDLLメソッドへの参照によって渡されないので、結果はまだ空ですが、それは私の想定に過ぎません。マッピングが正しいかもしれないが、メソッド呼び出しで誤って使用されている可能性があります。ご提案いただきありがとうございます。

答えて

0

正しい「タイプのタイプ」マッピングが見つかりませんが、この方法で試してみてください(長さ> 0)。

[編集:Technomageコメント参照]
ATTENTIONを:あなたはずっと ずっとより慎重 Memoryオブジェクトを使用している場合でなければなりません。 Javaオブジェクトがgarbadgeを収集すると、それらはネイティブレベルでfree'dになります。これは、あなたがラインを通過した後 .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

を与えるので、あなたのnew Memory(..)瞬間を消えるMemory.share()の呼び出しは、内部クラスを作成しますので、あなたのコードsuper(new Memory(value.length()*2+6).share(4));は時間の無駄であることを意味しSharedMemoryのインスタンス。元のMemoryオブジェクトへの暗黙の参照を持ちます。したがって、ctorの元の使用方法には何も問題はありません。 – technomage

+0

あなたは正しいです! mea culpa – Cerber

+0

それに応じて回答を編集する必要があります。間違ったアサーションは生きている必要はありません... – technomage

関連する問題