调用过程,调用过程有诸多技巧,它们与过程的类型、位置以及在应用程序中的使用方式有关。下面说明如何调用 Sub 过程和 Function 过程。
为东兰等地区用户提供了全套网页设计制作服务,及东兰网站建设行业解决方案。主营业务为成都网站制作、成都网站设计、外贸营销网站建设、东兰网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
调用 Sub 过程
与 Sub 过程不同,在表达式中,Sub 过程不能用其名字调用。调用 Sub 过程的是一个独立的语句。Sub 过程还有一点与函数不一样,它不会用名字返回一个值。但是,与 Function过程一样,Sub 过程也可以修改传递给它们的任何变量的值。
调用 Sub 过程有两种方法:
'以下两个语句都调用了名为 MyProc 的 Sub 过程。
Call MyProc (FirstArgument, SecondArgument)
MyProc FirstArgument, SecondArgument
注意,当使用 Call 语法时,参数必须在括号内。若省略 Call 关键字,则也必须省略参数两边的括号
调用函数过程
通常,调用自行编写的函数过程的方法和调用 Visual Basic 内部函数过程(例如 Abs)的方法一样;即在表达式中写上它的名字。
'下面的语句都调用函数 ToDec。
Print 10 * ToDec
X = ToDec
If ToDec = 10 Then Debug.Print "Out of Range"
X = AnotherFunction ( 10 * ToDec)
就像调用 Sub 过程那样,也能调用函数。下面的语句都调用同一个函数:
Call Year (Now)
Year Now
当用这种方法调用函数时,Visual Basic 放弃返回值。
调用其它模块中的过程
在工程中的任何地方都能调用其它模块中的公用过程。可能需要指定这样的模块,它包含正在调用的过程。调用其它模块中的过程的各种技巧,取决于该过程是在窗体模块中、类模块中还是标准模块中。
窗体中的过程
所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块 Form1 包含 SomeSub 过程,则可使用下面的语句调用 Form1 中的过程:
Call Form1.SomeSub(arguments)
类模块中的过程
与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。例如,DemoClass 是类 Class1 的实例:
Dim DemoClass as New Class1
DemoClass.SomeSub
但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量(在这个例子中是 DemoClass )并用变量名引用它。
标准模块中的过程
如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。如果过程仅出现在一个地方,这个过程就是唯一的。
如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。在同一模块内调用一个公共过程就会运行该模块内的过程。例如,对于 Module1 和 Module2 中名为 CommonName 的过程,从 Module2 中调用 CommonName 则运行 Module2 中的 CommonName 过程,而不是 Module1 中的 CommonName 过程。
从其它模块调用公共过程名时必须指定那个模块。例如,若在 Module1 中调用 Module2 中的 CommonName 过程,要用下面的语句:
Module2.CommonName (arguments)
Public 用于声明对所有模块中的所有其它过程都可以使用的过程。
Private 用于声明只能在包含该声明的模块中使用的过程。
其实在VB中是不能直接使用汇编语言的,但是可以采用变通的方法,将汇编语言编译成二进制代码后,就可以在VB中使用了。
下面的代码以二进制代码的方式实现了无符号长整数的位移操作,因为VB不支持无符号长整数,要实现相同的功能比较麻烦而且效率低,要用汇编语言就简单多了。
Option
Explicit
Private
Declare
Function
CallWindowProc
Lib
"user32"
Alias
"CallWindowProcA"
(ByVal
lpPrevWndFunc
As
Long,
ByVal
hWnd
As
Long,
ByVal
Msg
As
Long,
ByVal
wParam
As
Long,
ByVal
lParam
As
Long)
As
Long
Private
Sub
Form_Load()
bin(0)
=
H824448B
bin(1)
=
H448B088B
bin(2)
=
H108B0424
bin(3)
=
H1089EAD3
bin(4)
=
H10C2C033
bin(5)
=
H90909000
a
=
HFFFFFFFF
b
=
8
CallWindowProc
VarPtr(bin(0)),
VarPtr(a),
VarPtr(b),
0,
Debug.Print
Hex(a)
End
Sub
这段代码执行了a=a8这样一个操作
其中
bin(0)
=
H824448B
bin(1)
=
H448B088B
bin(2)
=
H108B0424
bin(3)
=
H1089EAD3
bin(4)
=
H10C2C033
bin(5)
=
H90909000
是下面的C++代码编译后的二进制代码
long
CALLBACK
a_lm(HWND
a,
UINT
b,
UINT
c,
UINT
d)
{
(*(UINT*)a)=(*(UINT*)b);
return
0;
}
其对应的汇编语言如下
mov
eax,dword
ptr
[esp+8]
mov
ecx,dword
ptr
[eax]
mov
eax,dword
ptr
[esp+4]
mov
edx,dword
ptr
[eax]
shr
edx,cl
mov
dword
ptr
[eax],edx
xor
eax,eax
ret
10h
nop
nop
nop
用long
CALLBACK
a_lm(HWND
a,
UINT
b,
UINT
c,
UINT
d)这种形式,就可以直接用CallWindowProc来调用。
以上就是在VB中使用汇编(二进制代码)的一种方法,实际上用起来还是比较麻烦的,需要编译后在可执行文件中将代码接取出来
vb.net只要能调用API函数CallWindowProc就可以。
汇编码用Byte或Long数组储存,如果下标为0,那么你就可以:
Call CallWindowProc(数组(0),0,0,0,0)
然后把4个0 POP出去,中间是你要执行的汇编码,汇编码最后是
ret等返回的。