ActiveXに対してVisualBasic.NETから数値配列を渡す


かねやん  2005-04-07 19:30:15  No: 89287  IP: [192.*.*.*]

VisualC++.NETで作成したActiveXに対してVisualBasic.NETから数値配列を渡す方法がわからなくて困っています。
どなたかご教授願え無いでしょうか?

下記のようにやって見ましたが上手く行きません。

[VB側]
Dim i(100) As Long
Dim j As Long

i(0) = 123
i(1) = 234
i(2) = 345
j = AxTestControl.test3(i(0))


[VC側]
LONG CTestControl::test3(LONG* i){

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    return *(i+1);   //i+1のメモリを返すはず???

}

その結果、戻り値は期待した234ではなく 0 でした???????

編集 削除
魔界の仮面弁士  2005-04-07 19:48:49  No: 89288  IP: [192.*.*.*]

COMの配列ですよね。SafeArray系API を使ってみては?

編集 削除
かねやん  2005-04-07 20:44:08  No: 89289  IP: [192.*.*.*]

魔界の仮面弁士殿

早速のご回答感謝しています。
さっそくSafeArrayで検索したところ、COMに関する詳細ページを発見し
http://www.ops.dti.ne.jp/~allergy/com/com.html
下記のサンプルを実行して見ました。

[VC側]
LONG CTestControl::test3(VARIANT data)
{
    LONG      status;
    SAFEARRAY *psa;
    char      *buf;

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    if(data.vt & VT_BYREF)
        psa = *(data.pparray);
    else
        psa = data.parray;

    SafeArrayAccessData(psa,(void**)&buf);
    status = *buf;
    SafeArrayUnaccessData(psa);

    return status;
}


[VB側]

    Dim bytData(16383) As Byte
    Dim j As Long
    j = AxTestControl.test3(bytData)


しかし、VB側を実行したときに、

'System.NullReferenceException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。

と叱られてしまいます。
お助け願えないでしょうか

m(..)m m(..)m m(..)m

編集 削除