例如DLL导出了aa这个函数,调用格式是void WINAPI aa(bb cc)
bb是一个struct,是这样定义的:typedef struct _bb{
long a;
long b;
}bb;我在VB里是这样描述这个结构的:
Public Type bb
a As Long
b As Long
End Type在VB里是这样调用的
Public Declare Sub aa Lib "aa.dll" (cc As bb)Private Sub Command1_Click()
dim dd as bb
bb.a=1
bb.b=2
aa(dd)
End Sub运行时就出错了,我调试时发现VB是把bb.a的指针传入函数的,也就是传址,而我想改为ByVal的时候,也就是aa(ByVal bb),不能改啊,编译时出现"用户定义类型不能用",我该怎样才能把bb.a和bb.b的值传入函数里面呢??表述得不太清楚,希望大家回答吧,谢谢!!

解决方案 »

  1.   

    直接改成long
    Public   Declare   Sub   aa   Lib   "aa.dll"   (cc   As   long) Private   Sub   Command1_Click() 
    dim   dd   as   bb 
    bb.a=1 
    bb.b=2 
    aa(varptr(dd)) 
    End   Sub
      

  2.   

    你见过哪个API函数的参数是不通过指针而是直接传递结构的?
    这种方式不符合COM标准,用VB实现非标准的调用试试下面的方式
    public declare sub aa lib "aa.dll" (byval a as long, byval b as long)
    public declare sub aa lib "aa.dll" (byval b as long, byval a as long)
    '选用上面的哪个只能试试了,反正是通过两个参数压栈模拟整个结构的压栈,由于从来不记VB参数的压栈顺序,所以先a还是先b只能试了。
      

  3.   

    其实都可以的传机构也可以的
    可能是你导出的函数声明的方式不对
    声明成__stdcall就可以
      

  4.   

    的确这个是非标准的DLL,那个写的人写得太差了,但又没办法,一定要用里面的导出函数Tiger_Zhao的方法可以的,能用就行了,哎~~~~~还有什么方法可以能使用VB的Type来传入???
      

  5.   

    VB不能对结构型参数进行ByVal传递,标准是不能违反的。
      

  6.   

    试试看定义API的时候把类型换成Any看看
    Public Type bb
        a As Long
        b As Long
    End Typepublic declare sub aa lib "aa.dll" (cc As Any)Dim dd As bb
    dd.a = 1
    dd.b = 2
    Call aa(dd)
      

  7.   

    例如DLL导出了aa这个函数,调用格式是void   WINAPI   aa(bb  & cc)  PS: 使用引用传递即可.在VB: 
    Public   Declare   Sub   aa   Lib   "aa.dll"   (cc   As   bb) Private   Sub   Command1_Click() 
    dim   dd   as   bb 
    bb.a=1 
    bb.b=2 
    aa(dd) 
    End   Sub 
    PS: 没有什么规范不规范. 能实现的代码就是规范. 除非你是做大型的软件.
      

  8.   

     没有什么规范不规范
    //
    不赞成.难道谁还能不顾COM规范,传一个ByVal的结构到API里去?楼上的代码也是ByRef,不是吗?
      

  9.   

    Try:Public Declare Sub aa Lib "aa.dll"(cc As Byte)
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
    (Destination As Any, Source As Any, ByVal Length As Long) Private Sub Command1_Click()   
    dim dd as bb
    dim buff(7) as Byte    
    dd.a=1   
    dd.b=2
    CopyMemory buff, dd, 8
    aa(buff(0))   
    End Sub
      

  10.   

    老鸟去找个PLMM护士打一针就好了~~:)
      

  11.   

    在VB声明里分成两个参数传进去.
    典型的在Windows标准的API都有.例如: 
    C++:
    HWND WindowFromPoint(
      POINT Point   // structure with point
    );VB 6:
    Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long