C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 127 を表示中)
■75310 / )  Re[2]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ とら (3回)-(2015/03/12(Thu) 21:59:05)
No75306 (魔界の仮面弁士 さん) に返信


>>VB6.0で作成した実行ファイルからVC++6.0で作成したDLLに値を参照渡ししているものがあり、
>>このたびVB.net2008にアップグレードする事になりました。
>
> この文章だけだと、VB6 EXE から VB2008 DLL を呼ぶ方向にも読み取れてしまいますね。
>
> なお、製品名に .NET の名を冠するのは 2003までなので、
> 正確には、VB.net2008 → VB2008 だったりしますが、それはさておき。

なるほど、以後留意致します。



>>アップグレードウィザードを通してエラーや警告を除外した後に
>
> 提示されたコードは恐らく、実際のコードとは別物ですよね。
> (実コードを貼り付けたなら、as が小文字表記されているはずが無いので…)
>
> 「改修に失敗している現在のコード」だけではなく、
> 「正常動作している改修前のコード」も提示していただけないでしょうか。
> もしくは DLL 側のコードでも良いですけど。

アップグレードとエラー及び警告の対応は他の方がされていたので少々混乱しておりました。

アップグレード前のVB6.0の該当部分のソースになります。

-- 宣言部 ----

Declare Function Test1 Lib "TestFunc.DLL" (oStructure() As Any) As Long

Public Structure Structure1
Dim int1 As Long
Dim int2 As Long
Dim int3 As Long
End Structure


'配列の作成(10個の配列として宣言)
Public oStructure1(0 To 9) As Structure1


-- 処理 ----

'DLLの呼出し
Dim iRet as integer = -1
iRet = Test1(oStructure1())


>> Public Structure Structure1
> 構造体には StructLayoutAttribute を明示しておくことをお奨めします。
> たとえば、その DLL のパッキングサイズが 4 バイト単位なら、
> 『<StructLayout(LayoutKind.Sequential, Pack:=4)>』など。
>
>> '呼出し後に参照で渡した(oStructure1)の数が1つになっている
> 引数に MarshalAsAttribute を付与しておいてください。
> SizeConst が指定されていない場合、マーシャリングされるのは 1 つの要素だけだったはず。
>
>>色々調べてみたところ、値渡しにすると大丈夫(配列なのでそもそも参照型だから参照の値渡しになる)
>>といった記述があったので試してみたのですが、配列は10のままで戻ってくるようになったのですが、
>>値が格納されていません。
> 配列を値渡しした場合、それは In パラメーターとしてマーシャリングされるためかと。
> 結果を受け取る必要があるのなら、<InAttribute(), OutAttribute()> を付与しておいてください。


取り急ぎ、宣言部を下記のようにByValに変更し<InAttribute(), OutAttribute()> を付与してみましたが
配列数は10になったものの値は変わっていませんでした。

Imports System.Runtime.InteropServices

Declare Function Test1 Lib "TestFunc.DLL" (<InAttribute(), OutAttribute()> ByVal oStructure() As Structure1) As Long



確認は明日になりますが、引き続き宜しくお願い致します。

返信 編集キー/


管理者用

- Child Tree -