Rundll32exe是什么?顾名思义,“执行32位的DLL文件”。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有Rundll32exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。如果看到系统中有多个Rundll32exe,不必惊慌,这证明用Rundll32exe启动了多少个的DLL文件。当然,这些Rundll32exe执行的DLL文件是什么,我们都可以从系统自动加载的地方找到。
C程序的基本单元是函数。函数中包含了程序的可执行代码。每个C程序的入口和出口都位于函数main()之中。main()函数可以调用其他函数,这些函数执行完毕后程序的控制又返回到main()函数中,main()函数不能被别的函数所调用。通常我们把这些被调用的函数称为下层(lower-level)函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待状态,直到被调用函数执行完毕。函数可以有参数和返回值。
程序员一般把函数当作“黑箱”处理,并不关心它内部的实现细节。当然程序员也可以自己开发函数库。
说明一点,函数这一节很重要,可以说一个程序的优劣集中体现在函数上。如果函数使用的恰当,可以让程序看起来有条理,容易看懂。如果函数使用的乱七八糟,或者是没有使用函数,程序就会显得很乱,不仅让别人无法查看,就连自己也容易晕头转向。可以这样说,如果超过100行的程序中没有使用函数,那么这个程序一定很罗嗦(有些绝对,但也是事实)。
一、函数的定义
一个函数包括函数头和语句体两部分。
函数头由下列三不分组成:
函数返回值类型
函数名
参数表
一个完整的函数应该是这样的:
函数返回值类型 函数名(参数表)
{
语句体;
}
函数返回值类型可以是前面说到的某个数据类型、或者是某个数据类型的指针、指向结构的指针、指向数组的指针。指针概念到以后再介绍。
函数名在程序中必须是唯一的,它也遵循标识符命名规则。
参数表可以没有也可以有多个,在函数调用的时候,实际参数将被拷贝到这些变量中。语句体包括局部变量的声明和可执行代码。
我们在前面其实已经接触过函数了,如abs(),sqrt(),我们并不知道它的内部是什么,我们只要会使用它即可。
下面主要介绍无参数无返回值的函数调用。
二、函数的声明和调用
为了调用一个函数,必须事先声明该函数的返回值类型和参数类型,这和使用变量的道理是一样的(有一种可以例外,就是函数的定义在调用之前,下面再讲述)。
看一个简单的例子:
void a(); /函数声明/
main()
{
a(); /函数调用/
}
void a() /函数定义/
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}
在main()的前面声明了一个函数,函数类型是void型,函数名为a,无参数。然后在main()函数里面调用这个函数,该函数的作用很简单,就是输入一个整数然后再显示它。在调用函数之前声明了该函数其实它和下面这个程序的功能是一样的:
main()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}
可以看出,实际上就是把a()函数里面的所有内容直接搬到main()函数里面(注意,这句话不是绝对的。)
我们前面已经说了,当定义在调用之前时,可以不声明函数。所以上面的程序和下面这个也是等价的:
void a()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}
main()
{
a();
}
因为定义在调用之前,所以可以不声明函数,这是因为编译器在编译的时候,已经发现a是一个函数名,是无返回值类型无参数的函数了。
那么很多人也许就会想,那我们何必还要声明这一步呢?我们只要把所有的函数的定义都放在前面不就可以了吗?这种想法是不可取的,一个好的程序员总是在程序的开头声明所有用到的函数和变量,这是为了以后好检查。
前面说了,在调用之前,必须先声明函数,所以下面的做法也是正确的(但在这里我个人并不提倡)。
main()
{
void a();
a();
}
void a()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}
一般来说,比较好的程序书写顺序是,先声明函数,然后写主函数,然后再写那些自定义的函数。
既然main()函数可以调用别的函数,那么我们自己定义的函数能不能再调用其他函数呢?答案是可以的。看下面的例子:
void a();
void b();
main()
{
a();
}
void a()
{
b();
}
void b()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}
main()函数先调用a()函数,而a()函数又调用b()函数。在C语言里,对调用函数的层数没有严格的限制,我们可以往下调用100层、1000层,但是在这里我们并不提倡调用的层数太多(除非是递归),因为层数太多,对以后的检查有一些干扰,函数调过来调过去,容易让自己都晕头转向。
某些人可能就不明白了,看上面的例子,好象使用函数后,程序变的更长了,更不让人理解。当然,我举的这个例子的确没有必要用函数来实现,但是对于某些实际问题,如果不使用函数,会让程序变的很乱,这涉及到参数问题。
main ( )函数之外的函数 需要在main( ) 函数中调用才能被执行,否则就不会被执行了。
当然也有例外,比如在WINDOWS 编程的时候 会编写 “回调函数”,是由Windows *** 作系统在特定的情况下自动调用的。
希望我的回答对你有所帮助,很高兴和你一起讨论和学习C语言编程技术。
3、Function过程
VB包含内置的或内部的函数,还可用Function语句编写自己的Function过程。在定义了一个函数之后,可以像调用任何一个VB的内部函数一样使用它,即可以在任何表达式,语句或函数中引用它。
函数过程是标准模块中位中Function语句与End Function 语句之间的一系列语句。函数中的这些语句完成某些有意义的工作,一般是处理文本,进行输入或计算一个值。
通过将函数名与任何所需的参数一起置于一条程序语句中,可以调用该函数。换句话说,使用函数过程与使用内置函数(比如Time,Int或Str等)的方法完全相同。
每个函数完成一种服务,比如进行计算并返回一个值。
在标准模块中声明的函数在缺省的状态下是公用函数,它们可在任何事件中过程中使用。
(1)Function(函数)过程的定义
Function过程的定义格式:
[Public|Private|Friend|Static]Function 过程名[(参数列表)][As数据类型]
[程序段]
[过程名=表达式]
[Exit Function]
[程序段]
[过程名=表达式]
End Function
说明:
1)Function过程以Function开头,End Function 结束,之间是描述过程 *** 作的语句块,即“过程体”或“函数体”。格式中的“过程名”、“参数列表”、Public、Private、Friend、Static、Exit Function的含义与Sub过程相同。“As数据类型”是由Function过程返回的值的数据类型,如省略,则为Variant。
如:已知直角三角形两直角边的值,计算斜边,可定义一个Function函数。
Function hypotenuse(A as integer,B as integer) as string
hypotenuse=sqr(A^2+B^2)
End function
再例如:
Function BinarySearch(Lower,Upper As Integer) As Boolean
……
If Lower = Upper Then
BinarySearch = True
Exit Function
Else
BinarySearch = False '过程名=表达式
End If
……
End Function
2)调用Sub过程相当于执行一个语句,不返回值;而调用Function过程要返回一个值,因此可以像内部函数一样在表达式中使用。
在VB中调用Function过程的方法和调用任何内部函数的方法是一样的,如调用上面的“hypotenuse”函数:
label1caption=hypotenuse(Cint(text1text),cint(text2text))
strX=hypotenuse(width,height)
函数总是以该函数的名称返回给调用过程一个值。因此,函数中的最后一行语句往往是将函数的最终计算结果放入“过程名”中的赋值语句。例如,下文中的函数过程total1用来为某个工程计算,然后将结果赋值给total1名。
Function total1(cost)
t1=cost005
t2=cost0015
total1=t1+t2 '将结果赋值给Function函数total1。
end function
由Function过程返回的值放在上述格式中的“表达式”中,并通过“过程名=表达式”把它的值赋给“过程名”,如果在Function过程中省略“过程名=表达式,则该过程返回一个默认值:数值函数过程返回0值;字符串函数过程返回空字符串;variat函数则返回empty。如果在返回对象引用的Function过程中没有将对象引用赋给name(通过set),则函数返回nothing。一般地,为了能使一个Function过程完成所指定的 *** 作,通常要在过程体中为“过程名”赋值。
3)前面讲过,过程不能嵌套。因此不能在事件过程中定义通用过程(包括Sub过程和Function过程),只能在事件的过程内调用通用过程。
(2)建立Function过程
前面提到的建立Sub过程的三种方法也可用来建立Function过程,只是当用第一种方法建立时,在对话框的“类型”栏内选择“函数”。
(3)调用函数过程
例如:编写一个求公约数(GCD)的函数过程。
程序如下:
Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer
Do While y > 0
reminder = x Mod y
x = y
y = reminder
Loop
gcd = x
End Function
求公约数的方法:
两个数a、b,如果b能除尽a,则是这两个数的公约数(如6和3的公约数是3),否则:
GCD(a,b)=GCD(b,a Mod b)
例如:GCD(126,12)=GCD(12,126 Mod 12)=GCD(12,6)=6
下面介绍如何调用这个过程。
调用Function过程比较简单,可以像使用VB内部函数一样调用。因为Function过程返回一个值,所以完全可以将它看成一个函数,与内部函数(如Sqr,Str,Chr等)没什么区别,只不过内部函数由语言系统提供,而Function过程由用户自己定义。
程序总是从main函数开始执行的。
对于全局变量,声明的时候就对其赋值,也就是声明的时候,初始化它,是可以的。
因为声明的时候,就初始化,是在编译的时候,就处理了的。
程序要执行,必须经过编译和连接两个步骤,编译,会扫描整个文件,对每个宏,变量,语句,函数等等,都处理过,改展开的展开,改分配内存的分配内存。
如果某个变量,没用到,会在连接的时候知道,连接就是要看哪些用到了,哪些没用到,没用到的东西,最后不被连接进exe文件中。
int a=2,b=4; 这个语句,并不是给全局变量赋值的语句,而是声明的同时赋值的
你不能这样写:
int a,b;
a=2;//这才是赋值,如果放到所有函数的外面,是不行的。
int first_fun(){
b=4;//放在函数内部,是可以的
}
外部程序块的变量的作用域,也是向下兼容的。
因此,为例first_fun()中就不能用到C这个变量。就如:
int last_fun()
{
int a, b;
c= a;////////a,b,c都是局部变量,但c在下面才定义,所以,这里不能使用
int c;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)