VARIANTの文字列をByRefで渡す

SWTのVARIANT型を普通に使う分には、特に悩む事はないと思うのだが、
ByRef渡しのVARIANTを扱う際には、ちょっと不親切かも知れない。
プロトタイプ的には、

public Variant(int ptr, short byRefType)

なのであるが、ptr が指す先に、何を設定するかが問題である。
これがプリミティブ型であれば、

public void setByRef(int val)

だとか

public void setByRef(float val)

だとかがあるので、データサイズ分の領域をOS.GlobalAllocで確保してあげれば良いのだが、
文字列については、このようなメソッドが用意されていない。
とりあえず、ptr が指すアドレスから、NULL終端文字列を配置してみたが、これはNG。
ならばと、同じタイプを戻り値とするメソッドを呼び出してみて、その中身を調べてみると、
どうも、ptr の指すアドレスにもポインタが設定されており、
文字列の実体は、その先に配置されているようだった。
しかし、同様にやってみたつもりでも、自分がやると、何故かNGとなってしまう。
何故だ?
結論から言ってしまうと、文字列の場合、ptr に設定すべき値は、
COM.SysAllocStringの戻り値であるアドレスとなるようだ。
一見、通常のメモリアロケートとなんら違いが無いように見えるが、
BSTRは、文字列データの前に文字列長が配置される構造となっており、
COM.SysAllocStringは、その領域を含めてアロケートを行っている。
戻るアドレスが、文字列データの先頭(文字列長データの直後)となっているので、
通常のNULL終端文字列を扱うように使えるが、実は別物という、曲者である。

そもそも、Javaで、アドレスを駆使するようなプログラムを書かなきゃいけない時点で、
何か間違っているような気がしなくもないのだが...