例如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的值传入函数里面呢??表述得不太清楚,希望大家回答吧,谢谢!!
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的值传入函数里面呢??表述得不太清楚,希望大家回答吧,谢谢!!
解决方案 »
- 请教 数据显示控件
- 请教热键代码F10,F11分别是多少
- 请问为什么用 order by newid() 随机产生记录的时候,那些image字段不为空的记录无法被检索出来?
- VB6.0编的界面运行时,可不可以在WinXP下外观变为XP风格的?比如,ComboBox,CheckBox,还有MsFlexGrid中的滚动条?若可以,怎么实现?
- 初学者的菜菜问题,求教----感激!!!!
- 一個QQ網友的說明文字,有意思:)
- 菜鸟求助:怎样根据分辨率以及窗体的大小自动调整控件的大小啊?
- 使用ADO时,使用mysql和SQL Server2000数据库有很大差别吗?
- 关于进程通信技术
- 请大虾帮忙!这个SQL语句怎么写?多谢!
- 如何将二维数组转二进制用winsock发送
- 怎样消除VB对文本文件查找替换后在文件尾多出的空行?
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
这种方式不符合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只能试了。
可能是你导出的函数声明的方式不对
声明成__stdcall就可以
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)
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: 没有什么规范不规范. 能实现的代码就是规范. 除非你是做大型的软件.
//
不赞成.难道谁还能不顾COM规范,传一个ByVal的结构到API里去?楼上的代码也是ByRef,不是吗?
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
典型的在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