如题!
VC的比较清楚,但好像VB和VC不一样。那么VC传送过来一个结构体,我怎么快速的将其存放到VB相同的结构体中?
谢谢!

解决方案 »

  1.   

    用CopyMemory函数Copy变量的地址
      

  2.   

    我用的就是CopyMemory
    VC默认是4字节对齐啊~~~
    也就是一个大的结构体(含有Long,Byte等多种数据)中会填充大量的空字节,所以对于同一个结构体在 vc中使用sizeof(struct) 大于 vb中使用len(struct) 算出的长度。vc穿过来的buf()的长度为sizeof(struct),可是Copymemory的长度应该为len(struct),也就是说,会产生数据丢失。不知道我表述清楚了没有,大家有什么好的办法么?主要讨论结构体字节对其的问题。
      

  3.   

    也就是一个大的结构体(含有Long,Byte等多种数据)中会填充大量的空字节
    -----------------------------------------------
    这里指的是在VC中的字节对齐
      

  4.   

    你的类型声明有问题吧?注意 VB 和 VC 类型的差别。例如 VC 的 int 相当于 VB 的 Long。
      

  5.   

    我也怀疑楼主没有注意VB和VC类型的差别。VC默认是4字节对齐啊~~~
    也就是一个大的结构体(含有Long,Byte等多种数据)中会填充大量的空字节.
    ---------------------------
    没听过,这样的VC也太浪费资源了。Long+Byte=5字节
      

  6.   

    晕哦
    楼上2位,谢谢提醒。
    不过vc里面long int,shor int,int,char...vb里面Long Integer,Byte...占用多少字节我还是很清楚的,不要怀疑我搞错了。我这里说的是结构体。
      

  7.   

    不懂字节对齐的可以看看下面这个:(随手写的,在vc,vb下可以通过)
    #include <iostream>
    using namespace std;typedef struct MyNode{
    char a;  //1字节相当vb中的Byte
    int b;   //4字节,相当vb中Long
    }NODE;int main()
    {
    NODE x;
    cout<<sizeof(x)<<endl;  //输出为8,而不是5,因为编译器(操作系统)填充了3个字节
    }----------------------
    vb中
    Public Type MyNode
       a As Byte
       b As Long
    End TypePrivate Sub Command1_Click()
       Dim x As MyNode
       Print Len(x)    ‘5个字节
    End Sub---------------------
    所以我说这里讨论的是vc和vb的字节对齐问题,希望高手解答。
      

  8.   

    最好的办法就是查MSDN。结构体和一般的数据类型是一样的,只不过它把基本的数据类型给组合了一下。
      

  9.   

    呵呵,我明白了。
    你在VB中使用LenB(MyNode)试试,它的结果就是8。如果你把Long变成Integer试试,它又变了。
      

  10.   

    benyfeifei(狒狒) ( ) 信誉:100  2006-05-15 16:22:00  得分: 0  
     
     
       呵呵,我明白了。
    你在VB中使用LenB(MyNode)试试,它的结果就是8。如果你把Long变成Integer试试,它又变了。
    ------------------------------------------------------
    谢谢!
    希望有些原理方面的东西,解释一下vb的字节对齐  
     
      

  11.   

    在vb中用LenB函数。
    不过我以前一直用Len也没出问题。
      

  12.   

    用户自定义类型(User-defined Type)参数的传递  用户自定义类型在VB中是一种重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。它相当于C/C++中的结构类型(structure)。在VB中,允许程序员以传址的方式将自定义数据类型参数传入动态库,DLL过程也可以将修改后的参数返回VB程序。但是,在VB中仍然不支持以传值的方式传递用户自定义类型参数。  传递用户自定义类型参数时,必须确保VB中的数据类型的成员与动态库中的结构成员是一一对应的,所占空间也必须严格一致。这里所说的一一对应,不仅是指VB 中的所有结构成员在动态库的结构中都必须有对应的元素,而且它们在数据结构中定义的顺序也必须严格一致,这是VB中使用的"数据结构成员对齐方式"决定的。在VB 中,数据结构使用双字对齐方式(4-byte alignment),因此,在用户自己生成用于VB 调用的动态连接库时,也必须把编译选项"structure member alignment" 设为4字节(如前文所述)。  所谓结构成员对齐方式是指一个数据结构内部,其成员的排列方式。譬如,在VB中,其对齐方式是4字节,这就好象在一个数据结构内部分成了很多个4字节大小的小单元,如果相邻 两个或多个数据成员的大小可以放在一个单元中,那么就放在一起;否则这些小单元中可能 会出现未用的空字节。我们来看下面一个数据类型:
    Type TestType
    m1 as Integer
    m2 as Byte
    m3 as Long
    End Type 
      它的三个成员的大小加起来是2+1+4=7。但是,由于m1和m2的字节总长度是3,小于4,它 们就存放于一个单元中;但该单元剩下的一个字节不足以放下一个Long型的成员m3,于是m3 就被放在下一个单元中,它们之间就有了一个未用的空字节;因此,整个结构所占实际长度是8 字节。同理,如果将m3和m2的位置交换一下,它所占的尺寸就变成了9字节。可见,成员在结构 中的声明顺序也是非常重要的。  通常,当一个用户自定义类型中不包含字符串时,向动态连接库中传递该类型的参数是没有什么问题的。如果只传递一个自定义类型变量,则既可以传递该变量名,也可以传递该变 量的第一个成员,它们的效果是一样的,都是将该变量的地址传进了动态库;同样,如果要传递一个自定义类型的数组,则既可以传递该数组的第一个元素,也可以传递第一个元素的第一个成员。但是,如果用户自定义类型中包含字符串类型时,又该如何与动态连接库传递参数呢?答案是令人遗憾的:在VB中,你无法将一个包含字符串成员的用户自定义类型变量或数 组安全、正确地传入动态库中。如果你这样做了,即使某次侥幸得到了正确的结果,在其背后也隐藏着许多致命的危险。因此,如果一定要在用户自定义类型中包含字符串变量,并且该类型的变量又要作为参数传入动态库时,你最好修改类型定义,把其中的字符串成员用相应的字节数组类型替换掉(转换方法可参见前文),这样就可以在VB 和动态库间传递这种类型的参数了。  另外,在VB 中还可以把一个函数的指针传递到动态库中,方法也并不复杂。但笔者强烈建议最好不要这么做,因为这样一来VB 应用程序就几乎完全丧失了它所应有的安全性。如果 确实需要传递函数指针的话,那么还是编一个C/C++ 的程序来完成这项工作吧。  总之,在VB中调用DLL过程是一个比较复杂的问题,编程人员必须很好地把握,才能达到既提高了程序效率,开拓了程序功能,又不降低程序安全性的目的。另外需要特别指出的一点是,在本文中提到的所有动态连接库,都是指没有使用自动化(OLE Automation)技术的动态库,Windows API和大多数用户自编的动态连接库都是这种类型的。对于使用了OLE Automation技术的动态连接库,其参数传递的方式有所不同,读者可以参阅有关OLE 技术的书籍,在此不再涉及。
      

  13.   

    Modest(塞北雪貂)·(偶最欣赏楼主的分) ( ) 信誉:100  2006-05-15 17:17:00  得分: 0  
       在vb中用LenB函数。
    不过我以前一直用Len也没出问题。
    -------------------------------------
    这不是区分用Len还是LenB的问题,LenB求出来的是存放该结构体所需要的空间,我需要知道的是在这个空间中数据是怎么存放的,是否和vc的一致。而且你说你以前一直用len没有出问题,那是因为可能你结构体中的数据全是4个字节的数据,所以不存在补空字节的问题(在vc中)。
      
     
      

  14.   

    在VB中,其对齐方式是4字节
    --------------------------
    好像不是这样的吧,你试试下面的TypeType Test
      x As Integer
      y As Byte
    End Typedim t As TestLenB(t)=4
    Len(t)=2好像是对齐那个大字节的数据类型。
      

  15.   

    在VB中,其对齐方式是4字节
    --------------------------
    好像不是这样的吧,你试试下面的TypeType Test
      x As Integer
      y As Byte
    End Typedim t As TestLenB(t)=4
    Len(t)=2好像是对齐那个大字节的数据类型。--------------------------------------------------------------------------------
    这个结构体按照4字节对齐确实是用4字节来存放。
    弱弱的问一下,“也必须把编译选项"structure member alignment" 设为4字节(如前文所述)”,这个在那里设置,找了半天没找到。
      

  16.   

    用户自定义类型(User-defined Type)参数的传递  用户自定义类型在VB中是一种重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。它相当于C/C++中的结构类型(structure)。在VB中,允许程序员以传址的方式将自定义数据类型参数传入动态库,DLL过程也可以将修改后的参数返回VB程序。但是,在VB中仍然不支持以传值的方式传递用户自定义类型参数。  传递用户自定义类型参数时,必须确保VB中的数据类型的成员与动态库中的结构成员是一一对应的,所占空间也必须严格一致。这里所说的一一对应,不仅是指VB 中的所有结构成员在动态库的结构中都必须有对应的元素,而且它们在数据结构中定义的顺序也必须严格一致,这是VB中使用的"数据结构成员对齐方式"决定的。在VB 中,数据结构使用双字对齐方式(4-byte alignment),因此,在用户自己生成用于VB 调用的动态连接库时,也必须把编译选项"structure member alignment" 设为4字节(如前文所述)。  所谓结构成员对齐方式是指一个数据结构内部,其成员的排列方式。譬如,在VB中,其对齐方式是4字节,这就好象在一个数据结构内部分成了很多个4字节大小的小单元,如果相邻 两个或多个数据成员的大小可以放在一个单元中,那么就放在一起;否则这些小单元中可能 会出现未用的空字节。我们来看下面一个数据类型:
    Type TestType
    m1 as Integer
    m2 as Byte
    m3 as Long
    End Type 
      它的三个成员的大小加起来是2+1+4=7。但是,由于m1和m2的字节总长度是3,小于4,它 们就存放于一个单元中;但该单元剩下的一个字节不足以放下一个Long型的成员m3,于是m3 就被放在下一个单元中,它们之间就有了一个未用的空字节;因此,整个结构所占实际长度是8 字节。同理,如果将m3和m2的位置交换一下,它所占的尺寸就变成了9字节。可见,成员在结构 中的声明顺序也是非常重要的。  通常,当一个用户自定义类型中不包含字符串时,向动态连接库中传递该类型的参数是没有什么问题的。如果只传递一个自定义类型变量,则既可以传递该变量名,也可以传递该变 量的第一个成员,它们的效果是一样的,都是将该变量的地址传进了动态库;同样,如果要传递一个自定义类型的数组,则既可以传递该数组的第一个元素,也可以传递第一个元素的第一个成员。但是,如果用户自定义类型中包含字符串类型时,又该如何与动态连接库传递参数呢?答案是令人遗憾的:在VB中,你无法将一个包含字符串成员的用户自定义类型变量或数 组安全、正确地传入动态库中。如果你这样做了,即使某次侥幸得到了正确的结果,在其背后也隐藏着许多致命的危险。因此,如果一定要在用户自定义类型中包含字符串变量,并且该类型的变量又要作为参数传入动态库时,你最好修改类型定义,把其中的字符串成员用相应的字节数组类型替换掉(转换方法可参见前文),这样就可以在VB 和动态库间传递这种类型的参数了。  另外,在VB 中还可以把一个函数的指针传递到动态库中,方法也并不复杂。但笔者强烈建议最好不要这么做,因为这样一来VB 应用程序就几乎完全丧失了它所应有的安全性。如果 确实需要传递函数指针的话,那么还是编一个C/C++ 的程序来完成这项工作吧。  总之,在VB中调用DLL过程是一个比较复杂的问题,编程人员必须很好地把握,才能达到既提高了程序效率,开拓了程序功能,又不降低程序安全性的目的。另外需要特别指出的一点是,在本文中提到的所有动态连接库,都是指没有使用自动化(OLE Automation)技术的动态库,Windows API和大多数用户自编的动态连接库都是这种类型的。对于使用了OLE Automation技术的动态连接库,其参数传递的方式有所不同,读者可以参阅有关OLE 技术的书籍,在此不再涉及。
      

  17.   

    Modest(塞北雪貂)·(偶最欣赏楼主的分) ( ) 信誉:100  2006-05-15 17:54:00  得分: 0  
    ---------------------
    呵呵,不用发两遍。也就是说vb:
    在VB 中,数据结构使用双字对齐方式(4-byte alignment),因此,在用户自己生成用于VB 调用的动态连接库时,也必须把编译选项"structure member alignment" 设为4字节(如前文所述)。现在我不知道再那里设置"structure member alignment" 设为4字节,我用的是vb6.0企业版。下班回家,你们继续,我晚上再来!
      

  18.   

    http://www.yesky.com/20011030/202753.shtml
      

  19.   

    f56_2000(admin) ( ) 信誉:100  2006-05-15 18:34:00  得分: 0  
     
       这么简单都不知道,仔细找找。
     ---------------------------------------------
    编译选项"structure member alignment" 设为4字节
    我找不到(vb6.0)
      

  20.   

    f56_2000(admin) ( ) 信誉:100  2006-05-15 18:34:00  得分: 0  
    ----------------------------------------------------------------
    靠,我认识你,哈哈!
      

  21.   

    up编译选项"structure member alignment" 设为4字节
    我找不到(vb6.0)