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

わんくま同盟

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

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


(過去ログ 127 を表示中)
■75314 / )  Re[4]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ とら (4回)-(2015/03/13(Fri) 11:28:42)
No75312 (魔界の仮面弁士 さん) に返信

お手数をお掛けして申し訳御座いません。
再度徹底して見直してまとめなおしました。


>VB EXE 側ではなく、VC++ DLL 側のデバッガで要素数を確認されたのでしょうか。
VB2008側及びVC++側のデバッグ双方にて確認致しました。
VCで受け取った際に既に要素数が1個になっていたようなのでVB2008側での問題だと思いました。



VC++6.0側は内容が理解できなかったのでメソッドの宣言部のみです

VC++6.0側のType1に関しては、「受信データを格納する構造体へのポインタ
または受信データを格納した共有メモリの管理構造体へのポインタ」
と記載がありました


## VC++6.0 ###########

Test1_API int __stdcall Test1(LPSAFEARRAY *Type1)


## VB6.0 #############

-- 宣言部 ----

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

Public Type Type1
Long1 As Long
Long2 As Long
Long3 As Long
End Type

Public oType(0 To 9) As Type1


-- 処理 ----

Dim iRet As Long
iRet = Test1(oType())



## VB2008 アップグレード後にエラー及び警告を排除した状態で渡されたソース #############

-- 宣言部 ----

Declare Function Test1 Lib "TestFunc.DLL" (ByRef oStructure() As Structure1) As Integer

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

Public oStructure1(9) As Structure1


-- 処理 ----

Dim iRet As integer = -1
iRet = Test1(oStructure1)

'結果としては配列の要素数が1個になっており、値も変更されていない



## VB2008 ご指摘部分反映後 #############


'参照渡しを値渡しに変更しマーシャリングを追加

Imports System.Runtime.InteropServices

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

'結果としては配列の要素数は10個になったものの値は変更されていない



以上、引き続きお願い致します。

返信 編集キー/


管理者用

- Child Tree -