VB6.0から.NETへのアップグレードの際に、2次元Arrayの扱い方に困っております。
以下、.NETコード
ここで以下のようなエラーメッセージが出ます。
"Can not marshal field AdditionalFlag of Type GETSTATUS: This type can not be marshaled as a structure field".
Public Structure GETSTATUS
<VBFixedArray(3, MAX_NUM - 1)> Dim AdditionalFlag(,) As Short
Pub Sub Initialize()
ReDim AdditionalFlag(3, MAX_NUM-1)
End Sub
End Structure
VB6.0コード
Public Type GETSTATUS
AdditionalFlag(3, MAX_NUM - 1) As Integer
End Type
いろいろ調べてみたのですが、これといった答えがでなかったため、ここで質問させていただきます。このようなエラーメッセージの経験のある方いらっしゃいますか?
>Pub Sub Initialize()
これは単なるタイポとすると、コードに問題ないと思いますが。
私の環境ではエラーが出ません。
>これは単なるタイポとすると、コードに問題ないと思いますが。
アップグレードでも問題ないですねぇ。
エラーの再現方法が書かれていませんが、もしかしたら実行中の
話ですかね?DLL に構造体を渡しているとか???
とりあえず過去ログ検索『MarshalAs』とか…。
すみません、説明不足でした。
特攻隊長まるるう様、そのとおりです。DLLにこの構造体を渡すのですが。
.NET コード
Public Declare Function GetControl Lib "ComDll" (ByVal hDev As Integer, ByVal CtlCode As Integer, ByRef SData As Integer, ByVal SDataNum As Integer, ByRef pStatus As GETSTATUS, ByVal RDataNum As Integer) As Integer
Public Function GetStatus(ByVal hDev As Integer, ByRef pStatus As GETSTATUS) As Integer
GetStatus = GetControl(hDev, CTRL_GET_STATUS, VariantType.Null, 0, pStatus, Len(pStatus))
End Function
VB6 コード
Public Declare Function GetControl Lib "ComDll" (ByVal hDev As Long, ByVal CtlCode As Long, ByRef SData As Any, ByVal SDataNum As Long, ByRef RData As Any, ByVal RDataNum As Long) As Long
Public Function GetStatus(ByVal hDev As Long, ByRef pStatus As GETSTATUS) As Long
GetStatus = GetControl(hDev, CTRL_GET_STATUS, vbNull, 0, pStatus, Len(pStatus))
End Function
という風に、ComDllにGETSTATUSを渡したいのですが、どうも上で説明したエラーがでてしまい、うまくいきません。
この質問とは、違ってきてしまうかもしれませんが、たとえ、このAdditionalFlagの部分をComment outしたとしても、今度は、System.ExecutionEngineExceptionがでてしまいます。当方、.NETを始めて1週間。
ツイート | ![]() |