Vb6 如何使常量在多个项目之间可见?

Vb6 如何使常量在多个项目之间可见?,vb6,constants,global,Vb6,Constants,Global,我有一个向其他项目提供服务的项目,提供此服务的方法的返回值是String。在该项目中,我使用一些命名常量来表示返回的特殊带外值,以代替预期或可恢复的错误,否则服务将返回XML字符串 如下所示: ' modService.bas const SERVICE_BADARG as String = "Unsupported argument." const SERVICE_TOOMANY as String = "Too many Foos." ' cServiceProvider.cls Priv

我有一个向其他项目提供服务的项目,提供此服务的方法的返回值是String。在该项目中,我使用一些命名常量来表示返回的特殊带外值,以代替预期或可恢复的错误,否则服务将返回XML字符串

如下所示:

' modService.bas
const SERVICE_BADARG as String = "Unsupported argument."
const SERVICE_TOOMANY as String = "Too many Foos."

' cServiceProvider.cls
Private Function GetXMLString() as String
' generate and return XML string holding all sorts of generic stuff
End Function

Public Function PerformService(argument as String) as String
' do some stuff
If (some_condition = true) Then
    PerformService = SERVICE_BADARG
Else If (some_other_condition = true) Then
    PerformService = SERVICE_TOOMANY
Else
    PerformService = GetXMLString()
我希望能够从其他项目中获得这些常量,而无需冗余地定义它们。如果可能的话,我还希望避免将它们放在类中(在类中它们将被不必要地复制),并避免为每个类创建属性


它们都是常量,没有一个会改变。

为什么不在
constants.BAS
模块中定义常量,然后将其包含在每个项目中?这样,对于VB来说,定义看起来像是重复的,但是从您作为开发人员和维护程序员的角度来看,定义将全部收集在一个地方

另一种选择是创建一个定义常量的DLL,但这会使在所有代码中使用这些常量的值的成本更高,因为它们必须通过调用外部DLL来检索,而不是直接编译到目标代码中。这对于真正恒定的东西来说似乎有些过分了


请考虑“常量”值不一定与“只读”值相同。一个常量值,比如pi,永远不会改变,所以复制这些值确实不会损失太多。你再也不用回去换了。只读值(如错误消息字符串)可能会更改,因此它们实际上不是常量。将它们放在DLL中可能是有意义的。特别是当您试图做的只是显示一条错误消息时,性能并不是那么关键。

不幸的是,VB没有提供将常量嵌入DLL以供编译时使用的机制。你必须归还财产,就像你说的你不想做的那样


我肯定会使用BAS路线,除非有理由反对。另一种方法是创建一个类型库,并在其中定义字符串常量。为此,您必须学习ODL,并使用VB6附带的MkTypeLib.exe程序。或者,如果您以某种方式访问了Matt Curland的“Advanced Visual Basic 6.0”,那么有一个工具可以让您创建类型库。

我知道这很旧,但万一有人还在想。。。 尝试以下模式:

Public Function SERVICE_BADARG() As String
    SERVICE_BADARG = "Unsupported argument."
End Function
Public Function SERVICE_TOOMANY() As String
    SERVICE_TOOMANY = "Too many Foos."
End Function
或者更紧凑地使用冒号将内容放在同一行:

Public Function SERVICE_BADARG() As String: SERVICE_BADARG = "Unsupported argument.": End Function
Public Function SERVICE_TOOMANY() As String: SERVICE_TOOMANY = "Too many Foos.": End Function
可以将常数视为没有参数的函数。优点是函数可以是公共的,因此不必创建DLL。它也只允许在其他函数之前声明它们。VB6允许您隐藏括号:

x = "error: " & SERVICE_TOOMANY

Select Case y
    Case SERVICE_BADARG
        z = "error: y is a bad arg"
    Case SERVICE_TOOMANY
        z = "error: y is too many"
End Select

缺点是有一点开销,但这通常可以忽略不计

在这一点上,所有东西都是DLL的大杂烩,而且有太多的项目,不值得复制所有这些数据。DLL解决方案或多或少是我的目标。我将如何完成它?记录在案,这个特定的服务只会被大约6或7个项目使用。不过,我计划稍后尝试集中配置。设置存储在一堆杂乱无章的配置文件和注册表项中,我已经统计了几个不同的注册表和文件编辑模块,每个模块的功能、可见性和代码气味略有不同。集中可能涉及很多很多项目的内容,并将相同的常量复制50次,这会引起不满。顺便说一句,我是实习生,我的代码库是一片丛林。大型体系结构更改是不可能的。@Wug创建ActiveX DLL的能力是现成的。要编译其他类型的DLL,您需要做更多的工作。我会加入C++来做这件事,但对于大多数VB开发人员来说,这可能不是一个选项。我建议你调查一下。但是你的第二条评论确实说明了一个很好的观点,那就是仅仅把所有常量放在一个地方就真的值得接触大量的文件吗?很多人可能会告诉你不要浪费太多时间重构VB6代码,而是把精力集中在迁移上。值得考虑。不幸的是,不是。所有的代码肯定会从重写中受益,但这根本不可行。属性可能是最好的方法。