如何利用CASE Tool提取VB系统逻辑

如何利用CASE Tool提取VB系统逻辑

VB在主从架构盛行的年代,与delphi并驾齐驱,是企业广泛采用的程序语言。然而在微软推出新一代的.NET技术之后,由于VB转换为面向对象的技术有实际上的困难,因此在微软宣布终止VB技术支持之后,企业的VB系统面临迟早必须重写的命运。

然而行之有年的系统,冒然改写的风险,在于长久累积的营运知识,若隐藏在密密麻麻的程序逻辑中,没有文件化的信息可参考的话,任何幅度的更动,都必须回头查阅程序代码。

数小时内拆解VB程序各项结构

要解决这样的问题,可以选择具备逆向工程机制的软件产品,反向剖析系统的设计架构。以VB To Xupper为例,它可解构VB程序相关的使用者接口、程序逻辑与数据库结构,转入至Xupper。该套工具主要由松技网络数据库与肯美信息两家公司合作研发。

Xupper中的模型图,大部分均可透过VB to Xupper转换器全部转入Xupper,包括实体关联图、数据字典、系统架构图、数据储存库矩阵关联图、GUI及程序逻辑图等。不过该功能并不处理商业流程图与业务规则,因为这两项本是设计阶段需要自制的部分,无法逆向产出。

实际操作VB To Xupper转换的步骤并不困难。在这套系统中,解读数据库结构只需2个步骤,而VB程序的转入则包括转入GUI、程序与数据库关联图及程序流程图,需3道手续。

转入所需的时间依系统规模而定,简单的数据结构或单一VB档案,约在数分钟内完成。若以松技网络数据库本身的Firmus ERP为例,整套产品转入耗时约2~3小时。

解读数据库,勾勒架构设计

Xupper的数据字典模块罗列数据库所有的字段名称与解释,而表格关联图则显示每个数据表所包含的字段。VB to Xupper解读数据结构的顺序,是先读取字段转入数据字典,再转入ERD目录,最后组合字段完成表格关联图。

这样的设计与产品研发地的习惯有关,Xupper是日本公司研发的产品,当地对于正规化的要求很高,数据结构的设计必须先决定字段命名,再决定字段所属的数据表,最后才画关联图。

而且字段名称不能重复,在数据字典中,即使不同数据表的字段,命名也不允许重复。这样的作法,与台湾多数的数据结构设计习惯不同,所以利用VB to Xupper逆向解构数据结构时,可能发生字段名称相同的情况,此时,VB to Xupper便会发出警告讯息。

举例来说,在不同数据表具备相同字段名称的情况下,若字段的长度设定不同,例如同样是「Name」字段,有的长度是10,有的长度却是8,那么在转入Xupper时,系统将自动取最大长度,以统一长度规格。

其次,字段名称相同在Xupper中是不合法的设计,因此顾问团队将针对客户的情况,弹性调整转入Xupper的方式,在不影响现行数据结构的情况下,区隔字段的命名。

从画面、数据表关联到程序逻辑,逐步拆解设计逻辑

转入数据结构之后,下一步是解读程序代码,步骤包括转入GUI、分析每个程序所使用的数据表,以及程序逻辑。「转入GUI」功能将GUI转入Xupper,可以帮助开发者整理GUI之间的关联性,并在Xupper中模拟执行,了解每个控件将触发的画面或者程序。

而程序与数据库的关联性,则透过Xupper的分析矩阵图,则以C(Create)、R(Read)、U(Update)、D(Delete)标示每一只程序对每个数据表做了哪些处理。

程序逻辑的部分,VB to Xupper则解读程序代码,将业务处理流程的逻辑转入DLCP(Data Life Cycle Procedure)模块。用意是将较难理解的程序代码,转化成图形化的流程图,并提供程序代码与流程图的对照。

COBOL程序也有逆向转换工具

然而,系统的逆向工程很难单靠工具完成,仍有客制化及辅导的需求,松技与肯美两家供货商均能提供相关的顾问咨询服务。

松技网络数据库当初开发转换器的目的,是为了提取多年以来累积在程序代码中的产业知识,作为后续转向ASP.NET的基础。很快地,他们发现企业VB系统升级的需求不在少数,此外,金融界COBOL程序逆向工程的需求也很殷切,因此也开发出COBOL程序转入Xupper的工具。这些逆向工程的机制,对Xupper而言,将扩展出更多元的应用。

Visual Basic。Net基础概念和语法

Visual Basic.Net基础概念和语法

  从基础概念和语法开始,学一门语言,特别是现在都是可视化的开发了,但我建议还是不要急着先去拖拉几个控件,而是踏踏实实的先了解一下这门语言的概念、语法和规范。VB.Net虽然和以前的VB6在语法上非常的接近,但由于现在的VB.Net是全新的面向对象的语言,所以两者还是有些区别的。

  正如大家所知道的,现在VB.Net已经全面支持各种面向对象的特性了,并且还有了一些其他.Net环境所需要的特性:继承、重载、重写属性和方法、实现构造函数和析构函数、接口、委托、异常、命名空间、程序集、特征编程、多线程、共享成员。(我们在后面的笔记中会逐步的来探讨这些特征的。)

  先简单的描述一下VB.Net的语法,虽然它和VB6是如此的象像。所以讲述VB.Net的语句其实是对VB6语句的回顾,但有些语句是原先VB6所没有的。

  VB.Net语句分为:声明语句、赋值语句、条件语句、循环语句、数组处理语句、异常语句、控制流语句、调用语句、锁语句

  声明语句

  在VB.Net、中声明往往是指变量的声明。

  对于局部变量我们使用Dim修饰符进行声明。并且依然可以使用Const来修饰该变量为常数,Static作为描述静态变量依然有效。

  声明举例(对于类和数组我们在后面描述)

以下是引用片段:
Const s As String = "Hello" '常数局部变量
   Dim b As Boolean '规则局部变量
   Static i As Int32 '静态局部变量

  变量的可访问性

  上面的三个变量都是局部变量,我们知道局部变量只在声明它们的区域是可见的,在该范围外是无法访问的,对于那些需要更多访问的控制,VB.Net提供了更丰富的修饰关键字。

  可访问性修饰

  描述

  Public

  声明元素为公共的,对公共元素的可访问性没有限制。

  Private

  声明元素仅可以从同一模块、类或结构内访问。

  Protected

  声明元素仅可以从同一个类内,或该类的派生类中访问。

  Friend

  声明元素可以从同一个项目内访问,但不能从项目外部访问。

  Protected Friend

  声明元素可以从派生类或同一项目内或二者进行访问。

  可访问性举例(注意TestB,TestC和TestA的关系)

以下是引用片段:
Public Class TestA
   Public i As Int32 = 100 '访问无限制
   Private s As String = "Hello" '只有TestA可以访问
   Protected b As Boolean = True '只有TestA和它的派生类可以访问
   Friend d As Double = 3.1415926 '只有同项目类可以访问
   Protected Friend l As Long = 100000 '
   End Class
   Public Class TestB
   Inherits TestA'继承TestA
   Public Sub New()
   MyBase.b = False
   MyBase.d = 3.14
   MyBase.i = 10
   MyBase.l = 10000
   End Sub
   End Class
   Public Class TestC
   Public Sub New()
   Dim a As New TestA
   a.d = 3.14
   a.i = 10
   a.l = 1000
   End Sub
   End Class

  怎么样,是不是很简单啊,如果你有VB6的基础的话,相信很快就能过渡到VB.net。

Visual Basic 。隐式类型的局部变量

Visual Basic 9.0隐式类型的局部变量

 在隐式类型的局部变量声明中,局部变量的类型是通过局部声明语句右侧的初始值设定项表达式推断的。

  例如,编译器推断以下所有变量声明的类型:

以下是引用片段:
   Dim population = 31719
   Dim name = "Belize"
   Dim area = 1.9
   Dim country = New Country With { .Name = "Palau", ...}

  因此,它们完全等效于以下显式类型声明:

以下是引用片段:
   Dim population As Integer = 31719
   Dim name As String = "Belize"
   Dim area As Float = 1.9
   Dim country As Country = New Country With { .Name = "Palau", ...}

  由于局部变量声明的类型是通过新增的 Option Infer On(新项目的默认值)推断的,因此不管 Option Strict 的设置如何,对此类变量的访问始终是早期绑定的。程序员必须在 Visual Basic 9.0 中显式指定后期绑定,方法是将变量显式声明为 Object 类型,如下所示:

以下是引用片段:
   Dim country As Object = New Country With { .Name = "Palau", ... }

  推断类型可防止意外使用后期绑定,更重要的是,它允许为新数据类型(如 XML)绑定强大扩展,如下所示。

  For...Next 或 For Each...Next 语句中的循环控制变量也可以是隐式类型的变量。指定循环控制变量时(如 For I = 0 To SmallCountries.Count 或 For Each country In smallCountries 中所示),标识符定义一个新的隐式类型局部变量,其类型通过初始值设定项或集合表达式推断且作用于整个循环。通过应用此类型推断,可以重新编写打印所有小国家/地区的循环,如下所示:

以下是引用片段:
   For Each country In smallCountries
   Console.WriteLine(country.Name)
   Next

  country 的类型被推断为 Country,即 SmallCountries 的元素类型。

VB中调用Windows API的注意事项

VB中调用Windows API的注意事项

  Visual Basic以友好易学的可视化开发环境闻名于 世,成为人们学习计算机编程的首选语言。目前,全世界 大概有300多万人使用着Visual Basic语言。如果您想在这茫茫众生中出类拔萃,那么您就不得不学习API (Application Program lnterface,即Windows的应用程 序编程接口)编程。不懂API,那可成不了高手。

  API说到底就是一系列的底层函数,是系统提供给 用户用于进入操作系统核心,进行高级编程的途径。通过在Visual Basic应用程序中声明外部过程就能够 访问Windows API(以及其它的外部DLLs)。在声明了过程之后,调用它的方法与调用Visual Basic自己的过程相同。

  Visual Basic (VB)作为一种高效编程环境,它封装了部分Windows API函数,但也牺牲了一些API的功能。调用API时稍有不慎就可能导致API编程错误,出现难于捕获或间歇性错误,甚至出现程序崩溃。要减少API编程错误,提高VB调用API时的安全性,应重点注意下列八个问题:

  (1)指定“Option Explicit”

  编程前最好将VB编程环境中的“Require Variable Declaration(要求变量申明)项选中。如果该项未被指定,任何简单的录入错误都可能会产生一个“Variant”变量,在调用API时,VB对该变量进行强制转换以避免冲突,这样一来,VB就会为字符串、长整数、整数、浮点数等各种类型传递NULL值,导致程序无法正常运行。

  (2)注意VB整数和win32整数的区别

  在VB环境下,涉及到的所有integer(整型数),都是16位,而一旦涉及C/C++win32文档时,则是32位,阅读与Windows API函数或与32位动态链接库有关的资料或应用程序时,尤其要注意分析理解环境背景,以利于分清数据类型和数据结构,正确地声明API函数。

  (3)减少和避免使用As Any

  虽然用As Any的方法声明库,可使Windows API函数能接受多种类型的参数,但更严重的是,即使是一个很小的错误,比如遗漏类型标识符或错误地使用了ByVal关键字,都可能导致系统崩溃或很难发现的其他数据错误。

  (4)注意检查参数类型

  API错误中,除了因遗漏ByVal关键字导致的错误外,大约有50%是因为声明中有不正确的参数类型。在Win32环境下,无论是8位、16位,还是32位数值变量都是以32位传递,如果同时使用,则很难发现其中错误。如果声明的参数类型不同,被VB视为Variant传递给API函数,会出现“错误的DLL调用规范”的消息。

  (5)勿忘ByVal,确保函数声明的完整性

  ByVal是“按值”调用,参数传递时,不将指向DLL的指针传递给参数变量本身,而是将传递参数值的一份拷贝传递给DLL。比如传递字符串参数时,VB与DLL之间的接口支持两种类型的字符串,如未使用ByVal关键字,VB将指向DLL的函数指针传递给一个OLE2.0字符串(即BSTR数据类型),而Windows API函数往往不支持这种数据类型,导致错误。而使用ByVal关键字后VB将字符串转变换成c语言格式的“空终止”串,被API正确使用。

  (6)重新检查函数名

  在Win16环境下,API函数的名字不要求区分大小写,而在Win32环境下,则有此要求。在一个DLL函数里找不到声明的函数时,有必要检查一下函数名,对于管理字符串的函数,是否遗漏了A和W前缀。

  (7)预先初始化字符串,以免造成冲突

  如果API函数要求一个指向缓冲区的指针,以便从中载入数据,而此时传递的是字符串变量,应该先初始化字符串长度。因为API无法知道字符串的长度——API默认已为其分配有足够的长度。没有初始化字符串,分配给字符串的缓冲区有可能会不足,API函数将有可能在缓冲区末尾反复改写,内存里字符串后面的内容将会改写得一塌糊涂。程序表现为突然终止或间歇性错误。

  (8)跟踪检查参数、返回类型和返回值

  VB具有立即模式和单步调试功能,利用这个优势,确保函数声明的类型明确(API不返回Variant类型),通过跟踪和检查参数的来源及类型,可以排除参数的错误传递。许多API函数都有返回结果,指出自己是否执行成功。你若要对返回结果进行测试,用VB的Err对象的LastDllError方法可查阅这些信息,对错误可针对API函数调用,取回API函数GetlastError的结果,以修改声明,达到正确调用API函数之目的

vb简单的IP设置转换器

vb简单的IP设置转换器

  这些天总是带着笔记本在家/单位/客户等等几个地方跑来跑去的,于是在各个地方上网都是要重新设置的,有时候有线,有时候无线。唉,昨天我终于爆发了,再也受不了这么没有尽头的折磨了。于是我又用vb写了一个简单的IP设置转换器。(我已经上传,地址:http://download.csdn.net/source/500624)
界面如下:


其实利用vb修改ip地址是比较容易的。我利用的就是wmi方式。先是找出当前系统的所有网卡信息,下面给出的是找出所有网卡MAC地址的例程: Function GetMACaddress() Dim tempBool As Boolean strComputer = "." Set objWMIServiceGL = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNetAdaptersGL = objWMIServiceGL.ExecQuery("Select * from win32_NetworkAdapterConfiguration where(IPEnabled=TRUE)")
For Each obj In objs getMACAddress = getMACAddress & obj.macaddress & vbCrLf & vbCrLf 'Exit For '找第一个网卡就退出 Next obj End Function
然后根据所找到的各个网卡的进行信息(IP,DNS等)更改:
Function ModifyIP() strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objSWbemObjectSet = objSWbemServices.ExecQuery("Select * From win32_NetworkAdapterConfiguration Where Description='" & Combo1.Text & "'") For Each objNetAdapter In colNetAdapters sip = objNetAdapter.IPaddress(0) If Option1.Value = True Then 'DHCP is enabled objNetAdapter.EnableDHCP errDNS = objNetAdapter.SetDNSServerSearchOrder() Else strIPAddress = Array(Text1.Text) strSubnetMask = Array(Text2.Text) strGateway = Array(Text3.Text) strGatewaymetric = Array(1) StrDns = Array(Text4.Text, Text5.Text) errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) errDNS = objNetAdapter.SetDNSServerSearchOrder(StrDns) 'Exit For '只修改第一个网卡的设置 End If Next End Function