vc 实现的DLL,接口中有一个结构体,结构体为
typedef struct{  
 unsigned int  filter;
 unsigned int  lis_on;
 unsigned int  test;
 unsigned int  sleep;
 unsigned int  baud_rate;
 unsigned char code1;
}PORT_STRUCT;函数调用为
int __stdcall CreateObjectofA1(PORT_STRUCT stu_packet);在VB中如何实现CreateObjectofA1 的参数设置
(目前如果不参进结构体的unsigned char code1;成员,VB中已经调试通过,但是加进来后就不能,提示为Bad dll calling convention)这个问题我个人认为比较有意思,请各位研究一下

解决方案 »

  1.   

    typedef struct{  
     unsigned int  filter;
     unsigned int  lis_on;
     unsigned int  test;
     unsigned int  sleep;
     unsigned int  baud_rate;
     unsigned char code1;
    }PORT_STRUCT;type PORT_STRUCT
        filter as long
        lis_on as long
        test as long
        sleep as long
        baud_rate as long
        code1 as byte
    end typeint __stdcall CreateObjectofA1(PORT_STRUCT stu_packet);
    declare function CreateObjectofA1 lib "xxx.dll" (stu_packet as PORT_STRUCT) as long
      

  2.   

    你很仔细,我也是象你现在写的样子完成的,如果结构体中没有unsigned char code1,目前已经Pass,而且有很多种方法,但是加上后就不行
      

  3.   

    我想是不是和参数传递顺序有关。可能是结构体会被拆开压栈的吧。
    我没怎么用VB调过DLL但是我在C++下出过类似的问题。
    指定好调用方式应该没问题。
      

  4.   

    应该是这个问题了.建议楼主看看这个:
    http://www.yesky.com/428/1857428.shtml用:
    引入补位成员法
      

  5.   

    个人以为,与其补位,不如直接用long,反正都是浪费空间.
      

  6.   

    补位法和用long到已经试过了,不行
      

  7.   

    用LONG会不行吗?在VB里你把这个结构元素改为LONG再调用API,API也只是把最低位的那个BYTE拿来修改,返回后那个LONG变量的值就是无符号的CHAR的值,怎么会不对?要不调用前你再显式地给它个0。
      

  8.   

    province_(雍昊) :我不是很明白
    “要不调用前你再显式地给它个0“这句话,能不能详细一点谢谢先
      

  9.   

    不好意思,我没看仔细你的函数,声明应该是这样的Private Declare Function CreateObjectofA1 Lib "xxx.dll" (ByVal filter As Long, ByVal lis_on As Long, ByVal test As Long, ByVal sleep As Long, ByVal baud_rate As Long, ByVal code1 As Byte) As Long
    因为你的函数声明中不是结构的指针PORT_STRUCT* stu_packet而是直接声明了结构,这样的话,你vb里面就把声明结构中各成员按顺序声明在函数的参数列表中就可以了r = CreateObjectofA1(1, 2, 3, 4, 5, 6)
      

  10.   

    supergreenbean(超级绿豆 - 天气酷热,把我煮了熬汤吧) :
    我刚刚测试了,可以通过,但是我将结构体修改成
    typedef struct{ 
     unsigned int  filter;
     unsigned int  lis_on;
     unsigned int  test;
     unsigned int  sleep;
     unsigned int  baud_rate;
     unsigned char code1;
     unsigned char code2;
    }PORT_STRUCT;也就是多了一个 unsigned char code2,
    其它一样,调试再次出现提示为Bad dll calling convention再来研究一下!!!
      

  11.   

    因为参数压入堆栈时是以4字节为单位的,所以压入一个字节长度值的6,其实是压入了06 00 00 00,这样下一个参数肯定就会错位了。如果这个C函数是你自己写的话,就请把参数改成结构指针,这样就不会有那么多问题了,如果实在要这么写,那就这样传值吧Private Declare Function CreateObjectofA1 Lib "xxx.dll" (ByVal filter As Long, ByVal lis_on As Long, ByVal test As Long, ByVal sleep As Long, ByVal baud_rate As Long, ByVal code12 As Long) As Long
    Private Sub Form_Load()
        Dim r As Long
        'code1=6,code2=7
        r = CreateObjectofA1(1, 2, 3, 4, 5, 7 * &H100 + 6)
    End Sub
      

  12.   

    在此对所有关心和帮助的友人们致谢,特别是supergreenbean(超级绿豆 - 天气酷热,把我煮了熬汤吧),
    感谢你们的热心帮助,有你们的存在,我们的IT一定会有希望
    希望大家继续保持热情和无私,我会和你们同在
    再次表示感谢!
      

  13.   

    目前问题已经解决,整理如下:
    vc 实现的DLL,接口中有一个结构体,结构体为
    typedef struct{ 
     unsigned int  filter;
     unsigned int  lis_on;
     unsigned int  test;
     unsigned int  sleep;
     unsigned int  baud_rate;
     unsigned char code1;
     unsigned char code2;
    }PORT_STRUCT;函数调用为
    int __stdcall CreateObjectofA1(PORT_STRUCT stu_packet);在VB中定义为
    Private Declare Function CreateObjectofA1 Lib "xxx.dll" (ByVal filter As Long, ByVal lis_on As Long, ByVal test As Long, ByVal sleep As Long, ByVal baud_rate As Long, ByVal code12 As long) As Long调用为
    r = CreateObjectofA1(1, 2, 3, 4, 5, 7*&H100+6)如果在学习研究的过程中有疑问,请E_mail:[email protected]
    希望我能够帮助你
    再次对关心支持我的同仁们表示感谢