如何模拟ScriptingContext" ASPTypeLibrary.Application"宾语

时间:2013-04-12 22:58:23

标签: iis vb6 activex

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

让我感到悲痛的是“ASPTypeLibrary.Application”对象,它有两种截然不同的方式来访问它的存储值,例如:

 .Application("KeyName")

 .Application.Value("KeyName")

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

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

3 个答案:

答案 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。