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 でした???????
COMの配列ですよね。SafeArray系API を使ってみては?
編集 削除魔界の仮面弁士殿
早速のご回答感謝しています。
さっそく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