Visual Basic常见问题集锦

(04/29/2000)

  

 
Visual Basic 6.0 是什么?
Visual Basic 6.0 是用来创建高性能的企业应用程序及基于 Web的应用程序的最有效工具。Visual Basic 6.0 使开发者得以创建驻留在客户或服务器上或运行在分布式 n-层环境里的强壮应用程序。Visual Basic 6.0 这个快速应用开发(Rapid Application Development:RAD)工具既可以作为一个单独的产品也可以作为 Visual Studio 6.0 套件的一个组成部分。
如何安装Visual Basic?
安装的步骤如下:
1. 开始下载之前,先在您的计算机上建立一个下载目录。
2. 单击每条超级链接,便开始下载。将下载文件保存在您所创建的目录。
3. 将下载的文件解压到同一目录下。
4. 如果您已安装了MDAC 2.5,直接到第五步。否则,需运行MDAC_typ.exe文件来安装MDAC 2.5。
5. 运行SetupSP5.exe。
Visual Basic 6.0 在Visual Studio 中扮演什么角色?
Visual Basic 6.0 是 Microsoft Visual Studio 开发工具套件中的一个成员,为 Visual Studio 开发人员提供了用来创建应用程序和构件的生产效率最高的环境。
Microsoft Visual Studio 是一整套开发工具,向各大企业提供了创建解决方案的简单易用的工具。Visual Studio 专业版使开发者得以完全享受到 Microsoft Windows 操作系统及 Web 领域的发展带来的好处。Microsoft Visual J++、 Microsoft Visual Basic 开发系统、Microsoft Visual C++ 开发系统、 Microsoft Visual InterDev Web 开发系统及 Visual FoxPro 数据库开发系统,各具特色,各擅胜场。Visual Studio 企业版是快速创建以数据为中心的企业解决方案的完全套件。它包含诸如:可视化数据库工具(Visual Database Tools)、Microsoft Visual SourceSafe 版本控制系统、Microsoft Repository(Microsoft 储藏室)、可视化构件管理器(Visual Component Manager)、Microsoft Visual Modeler 和 Microsoft BackOffice 家族系列应用服务器的开发版本等企业和工作组开发特性。
哪个版本的 Visual Basic 6.0 最适合我?
Visual Basic 6.0, 标准版不要求事先的编程经验。这个版本是为学生、业余爱好者和别的任何想更多地了解基于 Windows 的应用程序是如何开发的人而设计的。
Visual Basic 6.0, 专业版是为需要创建客户/服务器应用程序或能访问 Internet的应用程序的个体专业人员或公司开发人员设计的。
Visual Basic 6.0, 企业版是为欲创建分布式、高性能的客户/服务器应用程序或 Internet 及 intranet 上的应用程序的开发组设计的。
Visual Basic 6.0 中有些什么新内容?
关键的新特性包括以下这些:
1. 集成的可视化数据库工具:Visual Basic 6.0 提供一整套工具以在任何应用程序中集成数据库。数据库特性包括用来设计和修改 Microsoft SQL Server、 Oracle 7.3.3 或以上及 AS/400 的数据库的工具。
2. 数据环境设计器:使用拖放功能来可视化地创建可重用的记录集命令对象。绑定到多个数据源上,以聚集和操作数据。
3. 用拖放方式创建绑有数据的表格和报告:使用新的数据环境设计器,开发者可迅速拖放自定义的绑有数据的控件来创建表格;可用新的数据报表设计器来创建报表。创建自定义数据层阶结构也非常容易,只需填写一个对话框,再将命令拖入表格中即可。
4. Visual Basic WebClass 设计器:创建可在任何平台上用任何 Web 浏览器访问的服务器方应用或构件。
5. 动态 HTML 页面设计器:开发用文档对象模型和动态 HTML 平面作用户界面的富于多媒体的应用。
新的性能方面的增强。使用新的字符串函数和诸如驻留内存(Retain in Memory)的技术来创建更快、可调节性更好的应用程序和构件。
Visual Basic 6.0 如何使我得以创建企业解决方案?
Visual Basic 6.0 是 Microsoft 的首要企业开发套件 Visual Studio 6.0企业版工具套件的一个成员。Visual Studio 6.0 企业版为企业开发人员带来了若干新特性,包括:
1. 企业数据库支持,包括用来做 Oracle 和 SQL Server 数据库上的数据概图和存储过程设计的企业可视化数据库工具(企业版 Visual Database Tools);SQL Server 6.5 的开发版及与 AS400 和 IBM 大中型机上的 VSAM 和 DB/2 数据库相连接的 SNA Server 4.0 的开发版。
2. 增强的生存周期生产力,包括用来设计基于通用模型语言( Universal Modeling Language:UML)的多层应用的 Microsoft Visual Modeler 2.0(可视化建模器);及给多层应用做性能描绘和分析的 Visual Studio Analyzer(分析器)。
3. 组开发支持,包括一个分布式的、基于工作组的 Web 开发系统,Visual SourceSafe 6.0 源码控制系统,Microsoft Repository(储藏室)及用来组织和在工作组间共享可重用商务构件的工具,Visual Component Manager 2.0(可视化构件管理器)。
4. 集成的应用服务,包含 Microsoft BackOffice 4.5 的开发版,带有包括数据库、事务、消息队列、消息传递与合作、Web 应用、安全 及 SNA 连接在内的集成应用服务。
Visual Basic 6.0 中有那些新增特性能提高用 Visual Basic 写成的应用程序的性能?
Microsoft 在 Visual Basic 中做了若干改良以提高性能。首次在 Visual Basic 5.0 中引入的自然代码编译只是这些用来提高应用程序性能的重要特性之一。根据语言性能基准(benchmarks)Visual Basic 6.0 要比 Visual Basic 4.0快上足 20 倍。这些新特性包括"驻留内存"选项,这个选项将服务器分布式(server-distributed)应用程序的(已载入的)构件结构高速缓存在内存里。
WebClasses 是什么,应该何时使用?
Visual Basic 6.0 WebClasses 是基于 Web 服务器的 COM 构件,它赋予Visual Basic 编程人员以在 Visual Basic 开发环境内书写代码来自定义 Web 服务器的 URL 响应的能力。由此生成的 Visual Basic 应用程序是一个跨平台的基于服务器的应用,并可在任何平台上用任何 HTML 浏览器访问。
Visual Basic WebClasses 被设计用来帮助开发者完成以下任务:
1. 使用 Visual Basic 的事件驱动模型来创建基于 Web 的应用,以便将应用逻辑从用户界面隔离开来。
2. 创建现存 Visual Basic 应用程序的基于 Web 的前端。
3. 创建自定义的服务器方 COM 构件,以便在单一的环境里调试其应用程序。
为何我希望调用App.LogEvent方法将调试信息写入Windows NT的事件日志(Event Log)中,但我在调试时始终看不到有任何内容被写入?
这个功能仅对编译过的VB程序起作用,如果你在VB环境下执行,该语句会被忽略。为了在VB环境调试时也能使用该功能,你可以用VB编写一个ActiveX DLL组件,此组件公开一个方法用于写事件日志,将其编译后供你的VB程序调用。
什么是Visual Basic 6.0新添的模板特性?
模板使您能够创建一个公用的表单(Form),它可被任何VB程序重用,便于提高开发效率和实现一致的程序界面。
VB能否编写Windows NT/2000的服务程序(Service)?
Service程序一般都要在后台长期的运行,因此安全、稳定、健壮是Service程序的基本要求,这也要求一种更接近操作系统的语言来开发Service程序。Visual Basic 是一种高级编程语言,一般情况下我们需要使用ActiveX 组件来实现程序功能,但是我们往往不能清楚的了解到这些组件的具体实现细节,因此VB并不适合于开发Windows NT/2000的服务程序,而Visual C++则是一种较合适的语言。微软公司目前不推荐,也不支持用VB开发服务程序。
VB6.0是否支持继承,多态?
继承分为实现继承(implementing inherit) 和接口继承(Interface inherit), VB6.0的类模块提供接口继承的支持。使用implements 语句能实现接口继承。 VB6.0程序中能将子类赋于父类实现多态, 事实上它是通过对父类接口的查询(QueryInterface)来实现多态。
VB6.0创建的ActiveX DLL/EXE是否支持MTA?
VB6.0创建的ActiveX DLL的线程模式是STA或Thread-Oblivious, 任何MTA客户访问组件前必需创建一个新的线程,由新线程进入STA创建对象,然后返回接口代理。ActiveX EXE 的Thread Pool 也不是MTA,每一个新对象的创建都存在一个新的STA中,直到线程数量达到Pool的设定值。
我用VB开发了一个ActiveX EXE,其中包含了多个Class模块,但为何在DCOMCNFG..EXE中只看到一个Class?
DCOM提供了Server级的安全特性,所有在同一Server内的对象共享一个安全设置因此我们在DCOMCNFG..EXE中只能看到每个ActiveX EXE的第一个对象(Class)。
我在Internet Explorer 执行VB所产生的ActiveX Document,却产生了下列的错误信息,Run-time error '406': Non-modal forms cannot be displayed in this host application from an ActiveX DLL, ActiveX Control or Property Page. 如何解决?
这是ActiveX Document在 Internet Explorer执行的限制。您需使用 vbModal的属性来Open form。或是用下列代码,来测试Container是否支持vbModeless:
If App.NonModalAllowed Then
frmModeless.Show vbModeless
Else
frmModeless.Show vbModal
End If
为什么用VB的Internet Transfer Control (ITC)编写的FTP客户端应用程式,在联接某些服务器上(如IBM大型机等)的FTP服务时,工作不正常?
标准的FTP协议提供了两种传输模式:基于二进制的(Binary)和基于ASCII。Microsoft的ITC控件只实现了比较常用的传输模式:二进制传输模式(Binary)。而一些比较早的大型机上FTP服务往往是基于ASCII传输模式,这就使得ITC与这些机器上的FTP服务不兼容。
解决方法:使用WinInet API来实现上述两种模式的传输过程。
我下载并安装了MSXML3.EXE,但是我在程序中使用CreateObject("Microsoft.XMLDOM") ,发现还是用原来MSXML, 这是为什么?
缺省情况下,MSXML3 会与老版本(MSXML 2.5 or 2.5 SP1, 2.6)并行地安装在系统中, 这就提供很大的灵活性。但是,我们必须使用不同的Prog ID 来创建不同版本的对象。例如:
MSXML2.DOMDocument.2.6
MSXML2.DOMDocument.3.0
此外,也可以选择替换方式的安装。详情请见:
Installing Msxml3.dll in Replace Mode
如何在VB6.0获取Office文件的「摘要信息」?
网站上已经有一个用VC++写好的DLL,提供给VB程式开发人员,无需打开Office,即可读取这些利用OLE结构存储的文件。此DLL节省了程序开发人员相当多的时间。
VB如何调用C DLL时的参数传递?
首先必须了解此函数在C中的原型,包括参数类型和传递方式。
注意: 我们不推荐使用此方式, 如果DLL要接收一个字符串缓冲,一定要在调用前初始化字符串, 用户子定义类型必须用ByRef方式传递, 任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象句柄都能用此方式传递。 API Viewer 能帮助我们声明API函数, 我们可以更据需要修改参数传递方式。
如何在VB 实现Windows95/98,Windows NT/2000关机?
请参考以下代码:
Option Explicit
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type
'Beginning of Code
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_FORCE As Long = 4
Private Const EWX_REBOOT = 2
Private Declare Function ExitWindowsEx Lib "user32" ( _
ByVal dwOptions As Long, ByVal dwReserved As Long) As Long

 

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" ( _
ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" ( _
ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle
' Get the LUID for shutdown privilege.
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1 ' One privilege to set
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
' Enable the shutdown privilege in the access token of this
' process.
AdjustTokenPrivileges hdlTokenHandle, False, tkp, _
Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
End Sub
Private Sub cmdForceShutdown_Click()
AdjustToken
ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
End Sub
VB如何访问TAPI?
由于TAPI 2.X的大多数函数是基于异步方式,VB仅提供有限的支持。随着Windows 2000和TAPI 3.0的发布,VB已能用其公开的COM对象模型提供很好的支持。
VB6.0的数据访问技术有无任何的改进?
VB6.0的数据访问技术有了许多改进:
1. ADO2.0/OLE DB 数据库连接更广泛。
2. 新的Oracle schema及Stored procedure设计能力。
3. Data Environment 可以设计基于ADO的数据库连接。
4. 整合新的Report Designer。
5. MHFlexGrid控件可显示分层数据。
6. 改进的Data Binding技术。
在Visual Basic 6.0中什么是 Data Report Designer?
微软的Visual Basic 6.0 Data Report Designer是内嵌于VB6.0的分层式报表设计器。Report Designer 使开发者能从新的Data Environment Designer 中用把对象拖放入分级的报表设计器中,来创建基于文本的,单级或多级的报表,可用于打印或保存为txt或html格式的文件。另外,Data Report Designer 便于VB6.0 开发人员以程序方式控制他们整个报表的操作,就像数据集成和验证,都在VB6.0 的开发环境中完成。该工具与VB5 所带的Crystal Report 工具相比,其与开发环境的集成程度有了较大程度的提高。
" 我查询 ADO recordset的RecordCount属性总是返回 -1。
在ADO 1.5版本时当我们用adOpenForwardonly 游标类型打开记录集时,RecordCount属性返回 -1,在ADO 2.0, 2.1和2.5版本时用adOpenDynamic类型也会发生这种情况。因此如果要访问记录集的RecordCount属性,请使用adOpenKeyset 或 adOpenStatic作为Server端的游标或使用客户端的游标打开记录集。另外请注意使用的LockType,有些LockType会强制改变游标类型。如果数据供给程序不支持你所设的游标类型,数据供给程序可能会使用一种相近的游标作为替换,也造成游标类型的改变,请同时参照数据供给程序的文档。
如何在VB中使用ADO SHAPE Command 实现分层记录集?
分层记录集通过客户端游标引擎实现的MSDataShape provider提供数据。层次结构的记录有点类似于使用JOIN 和 GROUP BY 的SQL 语句,但又有不同,后者返回的记录集包含了主表和从表的字段,而前者的记录集仅含有主表的字段,另外,这个记录集也含有一个附加的字段代表相关从表的数据,你可以将它赋给另一个记录集变量。当你为统计功能使用GROUP BY 和统计函数时,统计值总出现在记录集上,而使用分层记录统计信息会出现在主记录集上而子记录集还保存着子记录的详细内容。
有三种类型的SHAPE可供选择,基于关系的(Relation Based),基于参数的(Parameter Based)和基于组的(Group Based) 语法如下:
SHAPE {parent-statement}
APPEND Aggregate
| ({child-statement} [As Alias]
RELATE parent-field TO child-field | parameter-marker
[, parent-field TO child-field | parameter-marker ...])
[, Aggregate | ({child statement})...]
SHAPE {non-normalized-statement} [AS Alias]
COMPUTE Aggregate
| Alias
| ({child-statement} [As Alias] RELATE parent-field TO
child-field | parameter-marker)
[, Aggregate | Alias | ({child-statement}...)]
[BY grouping-field [, grouping-field]]
SHAPE {non-normalized-statement} [AS Alias]
BY grouping-field [, grouping-field]
如何使用ADO访问加密的Access数据库?
如果你希望打开一个有口令保护的Access数据库,你可以用以下三种语法的任一种:
Dim MyConn As New ADODB.Connection
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Properties("Data Source") = "C:\...\JetPassword.MDB"
MyConn.Properties("Jet OLEDB:Database Password") = "MyPwd"
MyConn.Open
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Data Source=C:\...\JetPassword.MDB;" & _
Jet OLEDB:Database Password=MyPwd"
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Open ConnectionString:=strConn
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
Data Source=C:\...\JetPassword.MDB;" & _
"Jet OLEDB:Database Password=MyPwd"
MyConn.Open ConnectionString:=strConn
如果你打开一个数据库使用了Jet安全保护,你需要使用以下方式:
Dim MyConn As New ADODB.Connection
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Properties("Data Source") = "C:\...\JetSecurity.MDB"
MyConn.Properties("Jet OLEDB:System database") = "C:\...\System.MDW"
MyConn.Open UserID:="Admin", Password:="MyPwd"
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Data Source=C:\...\JetSecurity.MDB;" & _
"Jet OLEDB:System database=C:\...\System.MDW"
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Open ConnectionString:=strConn, _
UserID:="Admin", Password:="MyPwd"
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLEDB.3.51;"
"Data Source=C:\...\JetSecurity.MDB;" & _
"Jet OLEDB:System database=C:\...\System.MDW"
MyConn.Open ConnectionString:=strConn, _
UserID:="Admin", Password:="MyPwd"
注意:Jet 3.51 OLEDB provider 被设计用来打开Access97数据库,如果你要打开Access 2000 请使用Jet 4.0 OLEDB provider,当然Jet 3.51 OLEDB provider也能打开Access 97。
如果你希望使用Jet 4.0只要将Microsoft.Jet.OLEDB.3.51换成Microsoft.Jet.OLEDB.4.0
我用VB编写程序发布到某些计算机上,在连接Access数据库时出现运行时错误"3706: ADO could not find the specified provider",这是什么问题?
MDAC 2.0会安装Jet OLE DB provider 3.51版本。MDAC 2.1会安装Jet OLE DB provider 4.0版本,但如果机器上已经安装了3.51版本,MDAC 2.1不会删除也不会覆盖旧的3.51版本,这就使节3.51和4.0同时存在与你的开发机上。当连接Access数据库时,Jet OLE DB provider需要检查provider的版本号。而你在制作安装包时仅包含了MDAC 2.1,目标机上自然不可能有Jet OLE DB provider 3.51版本被安装,这就是错误发生的原因。此时你需要修改你的程序,使其使用4.0的Jet OLE DB provider。
用VB5开发的应用程序,在安装后,应用程序产生“The Jet VBA file (VBAJET.dll for 16-bit versions, or VBAJET32.dll for 32-bit versions) failed to initialize when called. Try reinstalling the applications that returned the error"的错误信息,该如何解决?
该错误说明系统丢失了必要的DAO或JET的文件。最可能的原因是程序由VB5.0编写而开发机器上(DAO或JET)已升级到VB6.0(如将VB5和VB6 安装在同一台机器上)。VB6.0的JET引擎需要一个额外的动态链接库expsrv.dll。而VB5的Setup Wizard则不会将此文件打包到安装程序中。
解决方案
1. 在没有安装过VB6.0的系统上,安装VB5.0,使用Setup Wizard 封装您的程序。
2. 升级至VB6.0,使用VB6.0的Package&Deployment Wizard 封装您的程序。
注意:方法一适用于尚未安装应用程序的客户机上,若客户机已产生了此错误信息,而您又不想升级到VB6.0来封装,那么您需要将客户机的DAO/JET取代为VB5.0的版本。为此,您需手工替代下列文件。
文件名
VB5.0
VB6.0
DAO350.dll
3.50.3602.0
3.51.1608.0
MSJET35.dll
3.50.3602.4
3.51.0623.4
MSRD2x35.dll
3.50.3602.0
3.51.0623.0
DAO350.dll 在目录\Program Files\Common Files\Microsoft Shared\DAO,其余两个文件都在\Windows\System(或\Winnt\System32)。
我用VB编写程序发布到某些计算机上出现运行时错误: ""-2147217872 (80040e30) :The given type name was unrecognized"。但是在某些机器上却运行正常。我的程序调用了SQL Server7.0的存储过程。在某些运行正常的机器上已安装了Access 2000, 而出错的机器上安装的是Access 97。请问这个错误会不会是与Access有关?
SQL Server 7.0 有SQL Server 6.5不具备的新数据类型:nChar, nVarChar, 它们是Unicode型字符。如果要在VB程序中调用以这些数据类型为参数的存储过程,就需要将旧版本的MDAC升级MDAC2.1或MDAC2.5。新版的MDAC可以在http://www.microsoft.com/data中找到并下载。因为安装Access 2000时会同时安装MDAC2.1,因此你的程序能够在安装Access 2000的机器下正常运行。
 
使用"安装与部署向导"(Package & Deployment Wizard)所生成的安装程序,在Windows95/98上安装时出错"Unable to load file msdadc.dll to register"的错误信息,该如何解决?
Microsoft Data Access Components 只能在安装了DCOM的环境下运行。若您在安装程序中封装了MDAC,那么确保在您的Win95/98上安装DCOM98。您可以通过运行VB6.0的第一片光盘中DCOM98\DCOM98.EXE完成安装。
我能在VB6中象用ADO一样用ADO.NET吗?
不能。 ADO.NET使用managed code, 它不能在VB6中调用。而VB7中可以。