2

我的任务是修改一些用 Visual Basic 6 编写的旧 ActiveX DLL。我需要做的一件事是模拟“ScriptingContext”对象,(这样我们就可以支持运行 IIS 以外的其他机制,而无需重写大块代码)。

让我有些悲伤的是“ASPTypeLibrary.Application”对象,它有两种非常不同的方式来访问其存储的值,例如:

 .Application("KeyName")

或者

 .Application.Value("KeyName")

如何创建自己的支持这两种访问机制的 VB6 类?我可以做一个或另一个,但不能两者都做?

(一个简单的代码示例将非常感谢,我不是 VB6 程序员)

4

3 回答 3

0

我找到了一种方法来做到这一点,请参阅下面从两个类“clsContext”和“clsContextApp”中获取的代码片段。后者实现“.Value”功能,前者具有“.Application”属性...

我现在发现了一个更困难的问题。ScriptingContext 的“ASPTypeLibrary.Request”对象具有三种不同的方式来访问其“.Request.QueryString”属性:

.Request.QueryString("KeyName")

.Request.QueryString.Value("KeyName")

.Request.QueryString

最后一个方法返回一个字符串,该字符串由所有由“&”字符连接的键/值对组成。我不知道如何实现这个?

' clsContext
Public ContextApp As clsContextApp


Public Property Get Application(Optional ByRef Key As Variant = Nothing) As Variant
 If (Key Is Nothing) Then
  Set Application = ContextApp
 Else
  If (Not ContextApp.p_Application.Exists(Key)) Then
   Application = ""
  Else
   Application = ContextApp.p_Application.Item(Key)
  End If
 End If
End Property

Public Property Let Application(ByRef Key As Variant, ByVal Value As Variant)
 If (VarType(Key) = vbString) Then
  If (VarType(Value) = vbString) Then
   If (Not ContextApp.p_Application.Exists(Key)) Then
    ContextApp.p_Application.Add Key, Value
   Else
    ContextApp.p_Application.Item(Key) = Value
   End If
  End If
 End If
End Property



' clContextApp
Public p_Application As Scripting.Dictionary


Public Property Get Value(Key As String) As String
 If (Not p_Application.Exists(Key)) Then
  Value = ""
 Else
  Value = p_Application.Item(Key)
 End If
End Property

Public Property Let Value(Key As String, Value As String)
 If (Not p_Application.Exists(Key)) Then
  p_Application.Add Key, Value
 Else
  p_Application.Item(Key) = Value
 End If
End Property
于 2013-04-13T01:22:38.190 回答
0

好吧,我已经设法回答了有关 ScriptingContext 的“ASPTypeLibrary.Request”对象的附加问题,该对象具有三种不同的方式来访问其“.Request.QueryString”属性。

我在下面包含了一个代码片段,该代码片段基于我之前对“ASPTypeLibrary.Application”对象的回答中的代码。如果我向“clsContextApp”类添加一个新属性并将其设置为该类的默认属性,那么它将在调用“.Application”属性时调用,而无需任何限定,例如:

MyString = Context.Application

在 VB6 中将特定属性设置为默认属性有点晦涩难懂,但我按照我在此处找到的说明进行了操作。

' clsContextApp Default Property
Property Get Values(Optional ByVal Index As Integer = -1) As String  ' This is the Default Value for clsContextApp
Attribute Values.VB_UserMemId = 0
 Dim KeyName As String, Value As String

 Values = ""

 If (Index < 0) Then
  For Index = 0 To p_Application.Count - 1
   KeyName = p_Application.Keys(Index)
   Value = p_Application.Item(KeyName)
   If (Index > 1) Then
    Values = Values + "&"
   End If
   Values = Values + KeyName + "=" + Value
  Next Index
 Else
  If (Index < p_Application.Count) Then
   KeyName = p_Application.Keys(Index)
   Value = p_Application.Item(KeyName)
   Values = KeyName + "=" + Value
  End If
 End If
End Property
于 2013-04-13T02:39:08.623 回答
0

添加对 Microsoft Active Server Pages 对象库和 COM+ 服务类型库的引用,然后使用对象浏览器显示您似乎缺少的一些基本内容。

GetObjectContext是 COMSVCSLib 中的全局方法,没有用于检索当前 ObjectContext 作为其返回值的参数。

ObjectContext是一个类。它有一个名为 Item 的只读默认属性,它接受一个 String 参数并且是 Variant 类型。

"Application"作为参数传递以Item返回应用程序类的当前实例。

ScriptingContext是一个类。它已经过时了。

Application是另一个类。它有一个名为 Value 的默认属性,它接受一个 String 参数并且是 Variant 类型。

Value是应用程序类的属性,并提供对读写键/值对存储的访问,其中键始终是字符串。由于它是 Variant 类型,因此您可以存储对象以及各种类型的简单值和数组。

在 VB6 中复制这些看起来并不困难。键/值存储可以是 Collection 或 Scripting.Dictionary。

于 2013-04-13T13:04:33.340 回答