プロが教えるわが家の防犯対策術!

VB6で画面を作成し、演算処理を行うDLLをVC6で作成しています。

下記のコードでVB6でSingle型の2次元配列を宣言しま、VCのDLLでエクスポートしている関数に渡
します。

VC6DLL側のコード----------
EXPORT void __stdcall TESTFUNC (float *pfData,long nSize{
}

VB側のコード----------
宣言
Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Long) As Long

配列宣言
Public sngDat(999,1) as single

呼び出し
TESTFUNC sngDat(0,0),1000

このように呼び出した場合、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの
ポインタをインクリメントした場合、sngDat(0,0),sngDat(1,0),sngDat(2,0)と、1次元目の添え字を
インクリメントした状態になるように、メモリに格納されています。
この動作を前提として、VB.net側でも同じように呼び出してみました。

VB.net側のコード----------
宣言
Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Integer) As Integer

配列宣言
Public sngDat(999,1) as single

呼び出し
TESTFUNC(sngDat(0,0),1000)

VC側は全く同じコードを利用するとします。

同じように、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの
ポインタをインクリメントした場合、sngDat(0,0),sngDat(0,1),sngDat(1,0)と,sngDat(1,1)、と1次元目の添え字を
インクリメントせず、2次元目の添え字をインクリメントした状態になるように、メモリに格納されています。

VB6→VC6のDLLの場合の配列渡しと、VB.net→VC6のDLLの場合の配列渡しで違いがあるのは
何故でしょうか?また、VB.net側の配列渡しの仕様を、VB6側の仕様に合わせる方法は無いのでしょうか?

よろしくお願いいたします。

A 回答 (1件)

VB.NET (というか、.NET Framework ) の配列と、ネイティブコードの配列は別物です。

.NET FrameWork では両者を

・ VB.NET で宣言する配列を 『マネージド配列』
・ C++等のネイティブコードの配列を 『アンマネージド配列』

と明確に別物として区別しており、両者を変換するためのマーシャリングをいう仕組みをわざわざ準備しています。詳細は以下を参照してください。
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6to …

配列のマーシャリングの方法は以下が参考になると思います。
http://msdn.microsoft.com/ja-jp/library/z6cfh6e6 …
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
ご指定の方法を調べましたが、多次元配列に関しては、サポートされていないかもしれませんね。残念です。

http://social.msdn.microsoft.com/Forums/ja-JP/vb …

お礼日時:2011/03/22 10:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!