【问题标题】:How to rewrite "LSet" from VB6 in VB.net (with structure types)?如何在 VB.net(带有结构类型)中从 VB6 重写“LSet”?
【发布时间】:2011-12-30 07:07:23
【问题描述】:

我有一个 VB6 应用程序,它使用 LSet() 和两种用户定义的数据类型 (Type),将数据从一种类型分配给另一种类型,例如:

Lset type1 = Type2

现在我必须在 VB.net 中应用等效逻辑。但是,在 VB.net 中,LSet cannot be used against different types(VB6 中的类型)。

如何在 VB.net 中实现 VB6 LSet 逻辑?

示例/典型代码:

Public MQ_Policy As typPolicyDataRetrieval 
Public typPolicyDataBlock As gtypPolicyDataBlock 

With MQ_Policy.Input 
   .PcPolicyIDNum = Mid(InputString, 1, 8) 
   .PcPolicyIDNumPrefix = " " 
   .Datalength = Format$(CLng(Len(MQ_Policy)) - (Len(MQ_Policy.MQHeader) + Len(MQ_Policy.Input.Datalength)), String$(Len(.Datalength), "0")) 
End With 

LSet typPolicyDataBlock = MQ_Policy

感谢您的所有帮助。

【问题讨论】:

  • 请接受我的建议。但问题是我无法将代码粘贴到这里,他们的任何网络都无法将这台机器连接到开发机器的网络,我也无法使用任何运输媒体.他们有什么其他方式我可以说清楚吗?我真诚地apolozise。
  • @Rajdeep 然后发布一个小的工作(但组成)示例。
  • (我什至不知道 VB6 中的 LSet 应该做了什么 :-)
  • Public MQ_Policy As typPolicyDataRetrieval Public typPolicyDataBlock As gtypPolicyDataBlock ****************************** 代码 *** ******************************************* 使用 MQ_Policy.Input .PcPolicyIDNum = Mid(InputString, 1, 8) .PcPolicyIDNumPrefix = " " .Datalength = Format$(CLng(Len(MQ_Policy)) - (Len(MQ_Policy.MQHeader) + Len(MQ_Policy.Input.Datalength)), String$(Len( .Datalength), "0")) 以 LSet 结尾 typPolicyDataBlock = MQ_Policy=

标签: vb.net vb6 vb6-migration


【解决方案1】:

您不应该在 VB.NET 中这样做。
还有其他方法,比如定义从一种类型到另一种类型的转换运算符,然后在代码中使用:

Private Structure t1
    Public a As Short
    Public b As Short
End Structure

Private Structure t2
    Public v As Integer

    Public Shared Widening Operator CType(ByVal v As t1) As t2
        Return New t2 With {.v = v.a Or (CType(v.b, Integer) << 16)}
    End Operator
End Structure

Sub Main()
    Dim v1 As t1, v2 As t2

    v2 = v1 ' Works!
End Sub

但是,如果您确定应该执行按字节复制,并且您知道 alignment issues 并对它们感到满意,那么您可以这样做:

Imports System.Runtime.InteropServices

Public Function CopyStructure(ByVal s As Object, ByVal ResultType As System.Type) As Object
    Dim h As GCHandle

    Try
        h = GCHandle.Alloc(s, GCHandleType.Pinned)

        Return Marshal.PtrToStructure(h.AddrOfPinnedObject, ResultType)
    Finally
        If h.IsAllocated Then h.Free()
    End Try
End Function

Sub Main()
    Dim v1 As t1, v2 As t2

    v2 = DirectCast(CopyStructure(v1, GetType(t2)), t2)
End Sub

【讨论】:

    【解决方案2】:

    在此处查看更好的答案:Converting VB6 Custom Type (with Fixed Length Strings) to VB .NET

    简而言之,当与类型一起使用时,LSet 将内存从一个地方复制到另一个地方!所以它不应该在任何情况下使用。原始代码不好,因此将其“按原样”转换将是一个坏主意。

    也就是说,如果对象兼容,您应该能够用 Cast 替换它,或者编写转换器函数来手动更改类型。

    【讨论】:

    • 情况听起来与您链接的问题相同。接受的答案适用(由,咳咳,我写)
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 2021-12-20
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多