gpt4 book ai didi

C# 结构到 VB6,反之亦然

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:54 26 4
gpt4 key购买 nike

我正在尝试从 C# 结构中转储数据,然后将数据加载到 VB6 结构中。这是当前代码:C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace MarshalTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct myStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string str;
[MarshalAs(UnmanagedType.I4)]
public int integer; // VB6 long
[MarshalAs(UnmanagedType.I2)]
public Int16 int16; // VB6 Integer
[MarshalAs(UnmanagedType.I1)]
public byte b;
[MarshalAs(UnmanagedType.VariantBool)]
public bool flag;

}

private void button1_Click(object sender, EventArgs e)
{
myStruct strc = new myStruct();
//String.Format("{0,6}", strc.str);
strc.str = "Abhi";
strc.integer = 49125071;
strc.int16 = 0491;
strc.b = 4;
strc.flag = true;
Type outputType = typeof(myStruct).IsEnum ? Enum.GetUnderlyingType(typeof(myStruct)) : typeof(myStruct);

byte[] bArr = new byte[Marshal.SizeOf(strc)];
IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(Marshal.SizeOf(strc));
Marshal.StructureToPtr(strc, ptr, false);
Marshal.Copy(ptr, bArr, 0, Marshal.SizeOf(strc));

using (FileStream fs = File.Create("C:\\users\\abhijeet\\desktop\\data.dat"))
{
fs.Write(bArr, 0, bArr.Length);
fs.Close();
}

// WM_APP is 0x8000
//IntPtr retval = SendMessage(m_HostWindow, 0x8000, IntPtr.Zero, ptr);
}
finally
{
if (ptr != IntPtr.Zero)
{
Marshal.DestroyStructure(ptr, typeof(myStruct));
Marshal.FreeHGlobal(ptr);
}
}
}

private string checkFixedLength(string str, int length)
{
if (str.Length > length)
{
return str.Substring(0, length);
}
return str;
}

}
}

VB6

    Option Explicit
'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal ByteLen As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
str As String
l As Long
i As Integer
b As Byte
flag As Boolean
End Type

Private Sub cmdCommand1_Click()
Dim t As myType, f As Long
Dim bArr() As Byte

Debug.Print LenB(t)

ReDim bArr(LenB(t) - 1)
f = FreeFile
Open "c:\users\abhijeet\desktop\data.dat" For Binary As #f
Get #f, , bArr()
Close #f

Dim ptr As Long, hHeap As Long
hHeap = GetProcessHeap
ptr = HeapAlloc(hHeap, 0, LenB(t))

CopyMemory ByVal VarPtr(t), ByVal VarPtr(bArr(0)), LenB(t)

Debug.Print t.str
Debug.Print t.l
Debug.Print t.i
Debug.Print t.b
Debug.Print t.flag
End Sub

由于某种原因,结构的大小始终返回 16,即使已设置大小常量。我是否缺少结构的某些内容?

谢谢

最佳答案

结构大小不会包括字符串内容,除非它是固定大小而不是指针。

[MarshalAs(UnmanagedType.ByValTStr, SizeConst=6)]
public string str;

(请注意 documentation for ByValTStr 表示它与具有空终止符的 Vb6 不同)

在 VB6 方面,您还希望将其设为固定长度的字符串以包含内联内容

str As String * 6

关于C# 结构到 VB6,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21901571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com