我的任务是修改一些用Visual Basic 6编写的遗留ActiveX DLL。我需要做的一件事是模拟“ScriptingContext”对象,(这样我们就可以支持其他运行DLL的机制了。 IIS无需重新编写大块代码。)
让我感到悲痛的是“ASPTypeLibrary.Application”对象,它有两种截然不同的方式来访问它的存储值,例如:
.Application("KeyName")
或
.Application.Value("KeyName")
如何创建自己的VB6类,它支持这两种访问机制?我可以做其中一个但不能两个都做?
(一个简单的代码示例非常感谢,我不是VB6程序员)
答案 0 :(得分:0)
我找到了一种方法,请参阅以下从两个类“clsContext”和“clsContextApp”中获取的代码片段。后者实现“.Value”功能,前者具有“.Application”属性......
我现在发现了一个更加困难的问题。 ScriptingContext的“ASPTypeLibrary.Request”对象具有三种不同的方式来访问其“.Request.QueryString”属性:
.Request.QueryString( “键名”)
或
.Request.QueryString.Value( “键名”)
或
.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
答案 1 :(得分:0)
我已经成功回答了有关ScriptingContext的“ASPTypeLibrary.Request”对象的其他问题,该对象具有三种不同的方式来访问其“.Request.QueryString”属性。
我在下面添加了一段代码片段,该代码片段基于我之前对“ASPTypeLibrary.Application”对象的回答中的代码。如果我向“clsContextApp”类添加一个新属性并使其成为该类的默认属性,那么在没有任何限定条件的情况下调用“.Application”属性时将调用它,例如:
MyString = Context.Application
将特定属性设置为VB6中的默认属性有点模糊,但我按照我找到的here指示进行操作。
' 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
答案 2 :(得分:0)
添加对Microsoft Active Server Pages对象库和COM +服务类型库的引用,然后使用对象浏览器显示一些您似乎缺少的基本内容。
GetObjectContext
是COMSVCSLib中的全局方法,没有用于检索当前ObjectContext作为其返回值的参数。
ObjectContext
是一个班级。它有一个只读的默认属性,名为Item,它接受一个String参数,类型为Variant。
将"Application"
作为参数传递给Item
,返回应用程序类的当前实例。
ScriptingContext
是一个班级。它已经过时了。
Application
是另一个类。它有一个名为Value的默认属性,它接受一个String参数,类型为Variant。
Value
是Application Class的一个属性,提供对读写键/值对存储的访问,其中键始终是字符串。由于它是Variant类型,因此您可以存储对象以及各种类型的简单值和数组。
这些在VB6中难以复制。键/值存储可以是Collection或Scripting.Dictionary。