如何将VB6中的数据类型转换至VB.net或C#?

2026-05-06 12:541阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计603个文字,预计阅读时间需要3分钟。

如何将VB6中的数据类型转换至VB.net或C#?

我正在将用VB6编写的应用程序转换为VB.NET。这个应用程序的一个功能是将一个Type对象发送到一个dll。我尝试将类型转换为结构体并调用dll,但似乎不起作用。我被困住了,任由命运摆布。

我正在将最初用vb6编写的应用程序转换为vb.net.这个应用程序的一个功能是它将一个“Type”对象发送到一个dll.我尝试将类型转换为结构并调用dll但它似乎不起作用.我被困了一个星期,任何帮助都会非常感激

这是类型的vb6代码

'Define WICS Communications Control Block (CCB). Type WicsCCBType ' Create user-defined type. CCBNum As String * 1 CCBVer As String * 1 Resp1 As String * 4 Resp2 As String * 4 PLUA As String * 8 LLUA As String * 8 Mode As String * 8 ReqMax As String * 5 ResMax As String * 5 End Type

以下是dll的调用方式

Private Declare Sub WICSRASP Lib "wicsrasp.dll" (MyWicsCCB As WicsCCBType) WICSRASP MyWicsCCB

这是我尝试使用vb.net,但它无法正常工作

'Define WICS Communications Control Block (CCB). <System.Runtime.InteropServices.StructLayoutAttribute( _ System.Runtime.InteropServices.LayoutKind.Sequential, _ CharSet:=System.Runtime.InteropServices.CharSet.[Unicode])> _ Structure WicsCCBType ' Create user-defined type. <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=1)> Dim CCBNum As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=1)> Dim CCBVer As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=4)> Dim Resp1 As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=4)> Dim Resp2 As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=8)> Dim PLUA As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=8)> Dim LLUA As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=8)> Dim Mode As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=5)> Dim ReqMax As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=5)> Dim ResMax As String End Structure

这是我试图称之为的地方

<System.Runtime.InteropServices.DllImportAttribute("C:\windows\system32\wicsrasp.dll")> _ Public Shared Sub WICSRASP( ByRef CCB As WicsCCBType, ByRef Request As DAWicsRequestType, ByRef Response As DAWicsResponseType) End Sub Dim CCB As New modWICSDiary.WicsCCBType() CCB.CCBNum = "B" CCB.CCBVer = "2" CCB.LLUA = " " CCB.Mode = "CICSMO2 " CCB.ReqMax = "2100 " CCB.ResMax = "2100 " CCB.Resp1 = "0 " CCB.Resp2 = "0 " CCB.PLUA = "WICSPLU " NativeMethods.WICSRASP(CCB)

对于值,相同的值适用于vb6类型

再次感谢你

我不知道OP是否已经解决了这个问题,但这是我的看法.

VB6中UDT内的固定长度字符串不作为指针编组,而是内联到结构中.此外,VB6在编组之前将Unicode转换为Ansi. VB6使用4字节对齐.

该类型将使用填充在内存中查看此内容,每个连续字段在图中命名为A到I,并且_由于对齐而是填充字节.

CCBNum As String * 1 | |+-CCBVer As String * 1 || || Resp1 As String * 4 || | || | Resp2 As String * 4 || | | || | | PLUA As String * 8 || | | | || | | | LLUA As String * 8 || | | | | || | | | | Mode As String * 8 || | | | | | || | | | | | ReqMax As String * 5 || | | | | | | || | | | | | | ResMax As String * 5 || | | | | | | | || | | | | | | | VV V V V V V V V AB__CCCCDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHH___IIIII___

因此CharSet应该是Ansi,StructAlignment应该是4.使用ByValTString很好,就像使用SizeConst一样.

如何将VB6中的数据类型转换至VB.net或C#?

本文共计603个文字,预计阅读时间需要3分钟。

如何将VB6中的数据类型转换至VB.net或C#?

我正在将用VB6编写的应用程序转换为VB.NET。这个应用程序的一个功能是将一个Type对象发送到一个dll。我尝试将类型转换为结构体并调用dll,但似乎不起作用。我被困住了,任由命运摆布。

我正在将最初用vb6编写的应用程序转换为vb.net.这个应用程序的一个功能是它将一个“Type”对象发送到一个dll.我尝试将类型转换为结构并调用dll但它似乎不起作用.我被困了一个星期,任何帮助都会非常感激

这是类型的vb6代码

'Define WICS Communications Control Block (CCB). Type WicsCCBType ' Create user-defined type. CCBNum As String * 1 CCBVer As String * 1 Resp1 As String * 4 Resp2 As String * 4 PLUA As String * 8 LLUA As String * 8 Mode As String * 8 ReqMax As String * 5 ResMax As String * 5 End Type

以下是dll的调用方式

Private Declare Sub WICSRASP Lib "wicsrasp.dll" (MyWicsCCB As WicsCCBType) WICSRASP MyWicsCCB

这是我尝试使用vb.net,但它无法正常工作

'Define WICS Communications Control Block (CCB). <System.Runtime.InteropServices.StructLayoutAttribute( _ System.Runtime.InteropServices.LayoutKind.Sequential, _ CharSet:=System.Runtime.InteropServices.CharSet.[Unicode])> _ Structure WicsCCBType ' Create user-defined type. <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=1)> Dim CCBNum As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=1)> Dim CCBVer As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=4)> Dim Resp1 As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=4)> Dim Resp2 As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=8)> Dim PLUA As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=8)> Dim LLUA As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=8)> Dim Mode As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=5)> Dim ReqMax As String <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=5)> Dim ResMax As String End Structure

这是我试图称之为的地方

<System.Runtime.InteropServices.DllImportAttribute("C:\windows\system32\wicsrasp.dll")> _ Public Shared Sub WICSRASP( ByRef CCB As WicsCCBType, ByRef Request As DAWicsRequestType, ByRef Response As DAWicsResponseType) End Sub Dim CCB As New modWICSDiary.WicsCCBType() CCB.CCBNum = "B" CCB.CCBVer = "2" CCB.LLUA = " " CCB.Mode = "CICSMO2 " CCB.ReqMax = "2100 " CCB.ResMax = "2100 " CCB.Resp1 = "0 " CCB.Resp2 = "0 " CCB.PLUA = "WICSPLU " NativeMethods.WICSRASP(CCB)

对于值,相同的值适用于vb6类型

再次感谢你

我不知道OP是否已经解决了这个问题,但这是我的看法.

VB6中UDT内的固定长度字符串不作为指针编组,而是内联到结构中.此外,VB6在编组之前将Unicode转换为Ansi. VB6使用4字节对齐.

该类型将使用填充在内存中查看此内容,每个连续字段在图中命名为A到I,并且_由于对齐而是填充字节.

CCBNum As String * 1 | |+-CCBVer As String * 1 || || Resp1 As String * 4 || | || | Resp2 As String * 4 || | | || | | PLUA As String * 8 || | | | || | | | LLUA As String * 8 || | | | | || | | | | Mode As String * 8 || | | | | | || | | | | | ReqMax As String * 5 || | | | | | | || | | | | | | ResMax As String * 5 || | | | | | | | || | | | | | | | VV V V V V V V V AB__CCCCDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHH___IIIII___

因此CharSet应该是Ansi,StructAlignment应该是4.使用ByValTString很好,就像使用SizeConst一样.

如何将VB6中的数据类型转换至VB.net或C#?