《计算机辅助机械设计》课件第4章_第1页
《计算机辅助机械设计》课件第4章_第2页
《计算机辅助机械设计》课件第4章_第3页
《计算机辅助机械设计》课件第4章_第4页
《计算机辅助机械设计》课件第4章_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章组合式软件设计4.1组合式软件设计的基本概念4.2接口技术4.3主程序的确定习题4.1组合式软件设计的基本概念

由一个或一个以上的开发环境开发的两个或两个以上的可执行程序连接而成的一个用户应用软件,可称为组合式软件。为什么要用多种开发环境来开发组合式软件呢?如1.5节所述,每个开发环境都有其长处与不足。当对软件的功能要求是多方面的时,比如,既要处理数据,又要做设计计算,还要实现参数化绘图时,如果采用多种易学易用的开发环境,就可以取其之长,避其之短,从而可以高效低成本地开发出应用软件。实践证明,组合式软件设计方法比较适合同时具备相关的专业设计能力和软件开发能力的“两栖”型专业人员。对于机械专业人员来说,要开发组合式机械设计软件,只要掌握几种比较流行的开发环境(如VB、VF、VL等)的使用方法就可以了,因为这些流行的开发环境都有一些共性,易于融会贯通。

用户使用组合式软件,与使用单一的可执行程序没有什么太大的区别。例如,为了实现参数化绘制一个直角三角形,可设计一个组合式软件,定名为“参数化绘制直角三角形”。为此,用VB设计一个可执行程序,其名称为chicunjisuan.exe(见代码4-1),作为“参数化绘制直角三角形”软件的主程序。在写字板环境上,用VL语言编写一个程序文件,其名称为sanjiaoxing.lsp(见代码4-2),作为“参数化绘制直角三角形”软件的从程序1。而acad.exe绘图程序(该绘图程序是AUTOdesk公司销售的AUTOCAD2000软件包中的一个程序)作为“参数化绘制直角三角形”软件的从程序2。当用户启动chicunjisuan.exe时,看到的第一个界面是图4-1,输入两个边长并单击“开始绘图”按钮后,看到的第二个界面是图4-2,对所绘制的直角三角形,可浏览、保存或打印。关闭图4-2所示的界面,程序又返回到图4-1所示的界面,用户可输入新的参数,重复上述操作,即可实现参数化绘图。图4-1参数化绘制三角形软件的主界面(VB)图4-2参数化绘制三角形软件的绘图界面

一个程序要完成人们赋于的任务,需要相应的信息流动或传递。在单一的可执行程序中,信息传递依靠的是内部变量(包括数组),即信息传递载体是内部变量。由于组合式软件不是单一的可执行程序,因此不存在统一的内部变量(数组),那么组合式软件的各个可执行程序之间靠什么载体来传递信息呢?几乎所有的计算机语言都具有对纯文本文件进行读写操作的功能,因此,组合式软件就用纯文本文件作为各个可执行程序之间信息传递的载体。这样的纯文本文件我们称之为数据传递文件。

不同的计算机语言对纯文本文件的操作方法是不同的,甚至对纯文本文件中的数据结构的要求也有所不同。因此,只要熟悉相关计算机语言对纯文本文件的读写方法和对数据结构的要求,就能游刃有余地使用纯文本文件传递信息了。组合式软件中的各个exe文件又是怎么连接起来的呢?所谓连接,就是在前一个exe文件中调用后一个exe文件。如何调用呢?每种计算机语言大都具有调用可执行程序的功能,这个功能是通过执行该语言的特定语句(函数)来实现的,我们称这样的语句(函数)为调用语句(函数)。因此,在前一个exe程序中,用调用语句(函数)来调用后一个exe程序,就实现了这两个exe程序之间的连接。

为了使组合式软件能够正确地完成工作任务,要求组合式软件运行时,当一个exe程序执行调用语句(函数)后,紧接着被调用的exe程序必须成为当前惟一的活动(执行)程序(调用程序必须暂停,即处于非活动状态);而且,调用程序过程中,在调用程序执行调用语句(函数)之前或之后,都应安排对数据传递文件的写入或读出操作,以实现预定的信息传递。例如代码4-1所示的程序在执行shell函数的语句iTask=Shell(“C:/ProgramFiles/ACAD2000/acad.exe",vbMaximizedFocus)之前,安排有数据写入语句Open"vbtoautocad.txt"ForOutputAs#1Print#1,Chr(40);Chr(32);a;b;c;Chr(32);Chr(41)Close

把直角三角形的三条边长数据(a、b、c)写入数据传递文件“vbtoautocad.txt”中,以供被调用程序sanjiaoxing.lsp运行时从中取出,见代码4-2。代码4-1窗体frmhuasanjiaoxing的全部代码OptionExplicitPrivateDeclareFunctionWaitForSingleObjectLib"kernel32"-(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLong

该函数的详解见表4-4PrivateDeclareFunctionCloseHandleLib"kernel32"-(ByValhObjectAsLong)AsLong’

该函数的详解见表4-5PrivateDeclareFunctionOpenProcessLib"kernel32"-(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,-ByValdwProcessIdAsLong)AsLong’该函数的详解见表4-3PrivateConstINFINITE=-1&PrivateConstSYNCHRONIZE=&H100000PrivateSubCommand1-Click()DimaAsSingleDimbAsSingleDimcAsSingleDimx,yDimiTaskAsLong,retAsLong,pHandleAsLong,rrAsLonga=Val(txta.Text)b=Val(txtb.Text)c=Sqr(a^2+b^2)

建立VB-AUTOCAD的数据接口文件:vbtocutocad.txtOpen"vbtoautocad.txt"ForOutputAs#1Print#1,Chr(40);Chr(32);a;b;c;Chr(32);Chr(41)CloseFileCopy"sanjiaoxing.lsp","C:/ProgramFiles/ACAD2000/acad.lsp"FileCopy"vbtoautocad.txt","C:/ProgramFiles/ACAD2000/vbtoautocad.txt"iTask=Shell("C:/ProgramFiles/ACAD2000/acad.exe",vbMaximizedFocus)pHandle=OpenProcess(SYNCHRONIZE,False,iTask)ret=WaitForSingleObject(pHandle,INFINITE)rr=CloseHandle(pHandle)Kill"C:/ProgramFiles/ACAD2000/acad.lsp"Kill"C:/ProgramFiles/ACAD2000/vbtoautocad.txt"EndSubEndSub代码4-2sanjiaoxing.lsp程序的全部代码(defunsanjiaoxing(abc)(command"erase""all""")(setqp0’(100100))(setqp1(polarp0(/pi2)a))(setqp2(polarp00b))(command"line"p0p1p2p0"")(command"zoom""Extents"""))(setqvbshuju(open"C:/ProgramFiles/ACAD2000/vbtoautocad.txt""r"))(setqvbautocad(readlinevbshuju))(setqvbautocad(readvbautocad))(setqa(nth0vbautocad)b(nth1vbautocad)c(nth2vbautocad))(closevbshuju)(sanjiaoxingabc)

有时,还需要在被调用程序运行结束、控制权返回到调用程序后(此时调用程序重新处于活动状态),从数据传递文件中读出由被调用程序写入的数据,见代码6-12所示程序。

exe程序之间的调用与信息传递是组合式软件设计时要解决的两个关键问题。下一节将介绍有关这两个问题的解决方法。4.2接口技术4.2.1程序接口

如前所述,组合式软件是由两个或两个以上的相互独立的exe程序连接而成的。这些程序之间的调用与信息传递对组合式软件设计是非常重要的。我们把程序之间的调用与信息传递总称为程序接口。为了便于介绍,把程序调用称为调用接口,把信息传递称为数据接口。4.2.2可执行程序的正确调用可执行程序有一个最显著的特点,就是在操作系统下可直接运行,比如,在Windows下,用鼠标双击即可运行。但是,由于组合式软件的各独立程序连接成的是一个有机整体,调用方式必须惟一,即必须由规定的前一个可执行程序来调用后一个可执行程序。在所有的可执行程序中,必须且只能规定其中一个在Windows环境下被直接运行,其余的都必须且只能通过调用接口来运行。这样,才能保证执行过程是正确的。这个在Windows环境下可直接运行的exe程序,我们称之为主执行程序,其余的都称为从执行程序。因此,在Windows环境下,直接运行组合软件中的任何从执行程序,都是“违法”的,都不是正确的运行过程,也不可能得到正确的结果。

为保证应用程序能够正确运行,得到预期的运算结果,必须规定用户能够且只能在操作系统下直接运行主执行程序,而不能够在操作系统下直接运行从执行程序。要从根本上避免用户在操作系统下直接运行从执行程序,最有效的方法是设计一个用于合法性验证的数据接口。为此,可在主执行程序中建立一个纯文本文件,写入一些用于合法身份验证的数据,这些数据可形象地被比喻为“门票”(也可称之为密码)。这个数据接口文件也相应地称为“门票”数据文件。在主执行程序中,为“门票”文件写入设定的数据(门票),在从执行程序被调用而运行开始后,首先打开“门票”数据文件,取出“门票”数据,接着,删除该文件。然后进行判断,如果“门票”数据与设定的数据相同,则继续往后执行;否则,中断执行过程。

由上可知,这个“门票”数据文件,只在主执行程序调用从执行程序的短暂时间内存在于磁盘上,其它时间内,它是不存在的。因此,如果用户在操作系统下直接单击了从执行程序(而不是单击主执行程序),该从执行程序运行时,首先要打开“门票”数据文件,但由于找不到该文件(因为该文件只能在主执行程序中创建),系统将给出警告提示,如图4-3所示,从而达到了避免“违规”操作的目的。下面是一个非常简单的例子,通过这个例子,读者可以更清楚地了解与掌握避免“违规”操作的方法。图4-3系统发出的警告【例4-1】下面是一个组合式软件,名称为“避免违规操作”,它包含的文件全部放在“E:\避免违规操作”路径下,如图4-4所示。“主程序.exe”是主执行程序,“从程序.exe”是从执行程序。该组合式软件的执行过程如下所述。图4-4“避免违规操作”软件的所属文件及其位置

如果用户双击从执行程序,则出现图4-3所示的提示;如果双击主执行程序,则进入身份验证界面(见图4-5),单击“登录”按钮,系统将进行身份验证。如果是合法用户(密码正确),则显示命令按钮“进入从程序”(见图4-6),用户若单击该按钮,主执行程序就调用从执行程序。从执行程序经过身份验证,若是合法用户(密码正确),则显示一条祝贺词(见图4-7)。主执行程序的全部程序(见代码4-3),从执行程序的全部程序(见代码4-4)。图4-5主执行程序界面图4-6显示“进入从程序”按钮图4-7从执行程序界面代码4-3主执行程序的全部代码OptionExplicit

PrivateDeclareFunctionWaitForSingleObjectLib"kernel32"-(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLong

PrivateDeclareFunctionCloseHandleLib"kernel32"-(ByValhObjectAsLong)AsLong

PrivateDeclareFunctionOpenProcessLib"kernel32"-(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,-ByValdwProcessIdAsLong)AsLongPrivateConstINFINITE=-1&PrivateConstSYNCHRONIZE=2PrivateshurucsAsIntegerPrivateSubcmdcall_Click()DimiTaskAsLong,retAsLong,pHandleAsLongOpen"门票数据文件.txt"ForOutputAs#1Print#1,Trim(txtmm.Text)CloseiTask=Shell(App.Path+"\从程序.exe",vbNormalFocus)pHandle=OpenProcess(SYNCHRONIZE,False,iTask)ret=WaitForSingleObject(pHandle,INFINITE)ret=CloseHandle(pHandle)EndSubPrivateSubcmddeng_Click()’

功能:验证身份

DimxAsIntegerIftxtmm.Text="qrm"Thencmdcall.Visible=TrueElseshurucs=shurucs+1Ifshurucs<=3Thenx=MsgBox(“密码不正确,允许输入三次,这是第”

+Str(shurucs)+“次”,_vbOKOnly,"避免违规操作")ExitSubElsex=MsgBox(“密码不正确,输入超过三次了,对不起,您不是合法用户”,_vbOKOnly,"避免违规操作")EndEndIfEndIfEndSub

PrivateSubForm-Initialize()cmdcall.Visible=FalseEndSub

PrivateSubForm-Unload(CancelAsInteger)cmdcall.Visible=FalseEndSubOptionExplicit

PrivateSubForm-Load()OnErrorGoToerrchuliDimmmAsStringDimxAsIntegerOpenApp.Path+"\门票数据文件.txt"ForInputAs#1Input#1,mmCloseKillApp.Path+"\门票数据文件.txt"Ifmm="qrm"Thenlbltishi.Caption="祝贺进入从程序成功!"代码4-4从执行程序的全部代码Elsex=MsgBox("对不起,您不是合法用户",vbOKOnly)EndEndIfExitSuberrchuli:IfErr=53Then’

未找到门票数据文件

x=MsgBox("警告:请运行"+Chr(34)+"主程序"+Chr(34),48)EndElseMsgBox(Error(Err))EndEndIfEndSub

1.shell()函数

shell()函数是VB的内部函数。它用于调用一个可执行文件,返回一个变体型Variant(Double)值。如果调用成功,该值就代表这个程序的任务序列号ID;如果调用失败,则返回0。其语法如下:

shell(pathname[,windowstyle])shell()函数中各参数的意义如表4-1。表4-1shell()函数中各参数的意义表4-2Windowstyle命令参数值一览

说明:如果shell()函数成功地调用了所要执行的文件,则它会返回程序的任务ID,任务ID是一个惟一的数值,用来指明正在运行的程序。如果shell()函数不能打开指定的程序,则会产生错误。

值得提醒读者注意的是,VB的shell()函数是以异步方式来执行程序的,即在VB应用程序中,用shell()函数启动的外部程序还没有执行完毕,就开始执行shell()函数之后的语句了。这与DOS版的QuickBasic的shell()语句有明显的不同(QuickBasic的shell()语句具有“等待”功能,shell()语句启动的外部程序执行完毕之前,调用程序一直停留在shell语句行上,等待外部程序运行,当外部程序运行完毕,才接着执行shell()语句下面的语句)。由于VB的shell()函数缺乏这种“等待”功能(这是VB的功能缺陷,尽管VB在可视化及其它功能方面比QuickBasic好),在组合式软件中,虽然VB6.0能够调用外部程序,有时却难以满足应用程序的最终功能要求。因为在组合式软件中,应用程序有时要求在shell()函数调用的外部程序执行过程中,获得相应的结果数据,这些结果数据又供shell()函数之后的程序使用。然而,不等外部程序执行完毕就执行shell()函数的下面语句,显然是不能获得后续程序所需要的数据的,从而也就难以实现预期的正确结果。为了使VB具备“等待”功能,可调用WinAPI函数。WinAPI函数是Microsoft平台的应用程序编程接口(即ApplicationProgrammingInterface的缩写。所有运行在Windows平台上的应用程序,包括Windows操作系统都需要调用这些函数)。调用WinAPI函数都必须首先声明。

2.OpenProcess函数

功能:用来创建一个正在进行的程序(也称为进程对象)句柄。返回值:长整型。在VB中的声明方法:

Private|PublicDeclareFunctionOpenProcessLib"kernel32"(ByVal-dwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByVal-dwProcessIdAsLong)AsLongOpenProcess函数的参数说明见表4-3。

表4-3OpenProcess函数中参数的意义

说明:①如果此函数调用成功,返回值为指定进程已打开的句柄,否则返回null。这个返回的句柄可以在任何需要进程句柄的WinAPI函数中使用。若打开成功,此句柄就被授权访问该进程对象,权限仅限于dwDesiredAccess参数所指定的访问范围内。②打开一个进程就创建一个进程句柄。与此进程句柄有关的一组访问可以使用该进程句柄完成。调用者在dwDesiredAccess参数中指定了所要对此进程进行的访问方式。

3.WaitForSingleObject函数

功能:等待一个可等待的进程对象。返回值:长整型。在VB中的声明方法:

Private|PublicDeclareFunctionWaitForSingleObjectLib"kernel32"-(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLongWaitForSingleObject函数的参数说明见表4-4。表4-4WaitForSingleObject函数中参数的意义

说明:函数调用成功将返回下列值之一:①WAIT-ABANDONED:等待的对象为互斥对象。它没有被释放但拥有它的进程被终止了。②WAIT-OBJECT-0:等待的事件被触发。③WAIT-TIMEOUT:等待的事件没有被触发,但定时器到时了。等待一个对象则要检查对象的当前状态。如果该对象的当前状态允许继续执行,那么对象状态会得到改变(例如,一个信号对象的信号量计算器会减1),然后进程继续执行。如果可等待对象一旦不允许继续执行(结束执行),则等待就结束,函数将返回0值。4.CloseHandle函数功能:关闭一个对象句柄。返回值:长整型。在VB中的声明方法:

Private|PublicDeclareFunctionCloseHandleLib"kernel32"-(ByValhObjectAsLong)AsLongCloseHandle函数的参数说明见表4-5。表4-5CloseHandle函数中参数的意义

说明:如果函数调用成功,则返回值为1(true)。一旦一个对象最后的打开句柄被关闭,则该对象就会从系统中删除。若要实现“等待”功能,除声明上述三个函数外,还需声明两个常量:

Private|PublicConstINFINITE=-1&Private|PublicConstSYNCHRONIZE=&H100000(或等于任意值的长 整型数值)

说明:使用WinAPI函数时,必须严格按上述声明,包括声明中的英文大小写都不得更改,否则就不能实现API函数的调用!为避免写错,可直接从VB的菜单项:外接程序/外接程序管理器/VB6APIviewer中查找这三个函数,然后插入应用程序中。下面举例说明这三个WinAPI函数的调用方法。假设要在一个可执行文件中的某个窗体(设为form1)的某个过程(设为Command1-Click)中用shell()函数调用一个可执行文件acad.exe(绘图平台),同时要求退出acad绘图平台后,才能执行shell()函数下面的语句。Command1-Click过程设计如下:

PrivateSubCommand1-Click()DimiTaskAsLong,retAsLong,pHandleAsLong,rrAsLong

先声明这几个长整型变量,以便接收函数的返回值

iTask=Shell("C:/ProgramFiles/ACAD2000/acad.exe",vbMaximizedFocus)

调用shell()函数,返回任务序列号ID给变量iTaskpHandle=OpenProcess(SYNCHRONIZE,False,iTask)

调用OpenProcess函数,返回值给变量pHandle,创建一个acad.exe进程对象句柄

ret=WaitForSingleObject(pHandle,INFINITE)

调用WaitForSingleObject函数,等待acad.exe程序,直到被终止。如果acad.exe被终止,WaitForSingleObject的返回值为0,结束等待,程序开始往下执行

rr=CloseHandle(pHandle)

调用CloseHandle函数,把OpenProcess进程对象从系统中删除

EndSub

在组合式软件中,为了处理设计结果或其它目的,常需要直接打开一些其它类型的文件,如*.txt、*.doc、*.dwg、*.xls、*.bmp、*.pjx等,这些文件都有相应的运行环境,比如:*.txt类需要在写字板环境中运行,*.doc类文件在word环境中运行,*.dwg类文件在AUTOCAD环境中运行,*.xls类文件在电子表格环境中运行,*.bmp类在画图环境中运行,*.pjx类文件在VF环境中运行。此时,也需要WinAPI函数的支持。要打开某个文件的运行环境,并同时显示该文件,可调用以下两个WinAPI函数:ShellExecute函数和GetDesktopWindow函数。

5.ShellExecute函数

功能:查找与指定文件关联在一起的程序的文件名。返回值:长整型。非零表示成功,零表示失败。在VB中的声明方法:Private|PublicDeclareFunctionShellExecuteLib"shell32.dll"Alias-"ShellExecuteA"(ByValhwndAsLong,ByVallpOperationAs-String,ByVallpFileAsString,ByVallpParametersAsString,-ByVallpDirectoryAsString,ByValnShowCmdAsLong)AsLong表4-6ShellExecute函数中的参数意义

6.GetDesktopWindow函数

功能:获得代表整个屏幕的一个窗口(桌面窗口)句柄。返回值:长整型。在VB中的声明方法:

Private|PublicDeclareFunctionGetDesktopWindowLib"user32"-Alias"GetDesktopWindow"()AsLong

注意:所有桌面图标都在这个窗口里拒绝。它也用于各类屏幕保护程序。7.run/n语句在VF中,当调用外部程序时,可用run/n语句。语法如下:

run[/n][nValue]msdoscommand|progamname命令中各参数的意义见表4-7。表4-7run/n命令中参数的意义

说明:nValue是在/n之后紧跟一个可选的数值,指定Windows应用程序的打开方式。注意不要在/n和数值之间加入空格。表4-8nValue的数值及意义例如:下列命令将打开Windows控制面板中的Windows颜色选择程序。

run/n3controlcolor4.2.3可执行文件之间的数据传递

如前所述,数据接口需要使用纯文本格式的文件(通

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论