■62461 / inTopicNo.9) |
Re[7]: C#からVBで作成したDLLへの構造体渡し |
□投稿者/ コバピー (4回)-(2011/10/12(Wed) 18:30:49)
|
■No62435 (魔界の仮面弁士 さん) に返信 > ■No62434 (コバピー さん) に返信 >>VB側Functionに戻り値の定義を追加し、DLLを再作成致しました。 >>Public Function xxxx(ByRef dData() as Type_Data) as Integer > その場合、DLL のバイナリ互換性が失われることになります。 > http://support.microsoft.com/kb/161137/ja > > アンレジストは「古いバージョンのDLL」に対して行い、その後、 > 「新しいバージョンのDLL」をレジストリ登録しておいてください。 > > >>変数aの記述を変更。 >> Array a = DTTBL; → System.Array a = DTTBL; > これは同義ですね。通常、「using System;」相当の記述があるはずなので、 > Array と System.Array を global::System.Array は同じ結果となります。 > > >>Functionの呼び出し記述を変更。 >> objVBDLL.xxxx(ref a); → short r = objVBDLL.xxxx(ref a); > これでコンパイルが通るなら、C# 側の実装に問題はありません。 > (ただし、C# 側は x86 ビルドにしておいてください) > > >>良さそうには見えますが実行しますと、 > そのエラーを発生させているのは、.NET 側ではなく ActiveX 側だと思います。 > いわゆる「実行時エラー」でしょうね。 > > DLL そのものの実装に問題がある可能性もありそうなので、VB6 開発環境で > デバッグ実行した状態で C# から呼び出し、問題がないかどうか確認してみてください。 度々申し訳ありません。 デバッグ実行してみましたが、結果は同じでした。(「パラメータが間違っています」となります) また、VB側DLLのメソッドに設定したブレークポイントにも掛かりませんでした。 ちなみに、以下の様にメソッド及び呼び出しを追加し、メソッドの先頭行にブレークポイントを 設定してみましたが、こちらはブレークポイントでの停止と、その後の実行でMsgBoxの表示、 C#側で配列の内容まで確認することができました。
●C#側 float[] fltBuf = new float[10]{ 1,2,3,4,5,6,7,8,9,10 }; System.Array a = fltBuf; float[] fltBuf2 = new float[10]; System.Array b = fltBuf2; short r = objVBDLL.yyyy(ref a,ref b); ●VB側DLL public function yyyy(ByRef sngBuf() as Single, sngRBuf() as Single) as Integer Dim intI as integer for intI = 0 to 9 MsgBox "sngBuf(" & intI & ")=" & sngBuf(intI) , vbOKOnly sngRBuf(intI) = sngBuf(intI) * 19 Next intI End function 何か考えられる事がありましたらお教え頂けませんでしょうか。 よろしくお願いします。
|
|