很多人都在讨论 COM 互操作,我已经全部阅读过了。
案例 1:VB 6 或 VBA 需要使用 .NET 中的库(我有 FileNet 对象,IBM 已经创建了一个可以被 VBA 使用的 COM 包装器 DLL
案例 2:您的 .NET 源代码需要使用 COM/COM+ 对象类,这不是我的情况。
所以我的情况是案例1。我不必处理泛型(请参阅Genetics and COM interop don't Mix,文章使用反射来解决问题,但速度很慢。现在使用C#4.0动态是去(快 100 倍) http://www.west-wind.com/weblog/posts/2007/Jul/10/Generics-and-COM-Interop-dont-mix )
为什么我需要编写另一个包装器?因为 IBM 文档说由于 .NET 库的限制,不支持 ADOConnection。还有另一个功能不可用(它曾经在以前的版本中可用,所以我的 ASP 调用它)所以我必须生成我自己的。
Function FilterClassDescriptions(ByVal ObjType As Variant, Optional FilterType As Variant) As Variant
FileNet 的包装 COM DLL 使用 FNCE 的类,该类被编译成 .NET DLL。由于 .NET 不支持 ADOConnection,显然有些功能不再支持。但我的 ASP 依赖于这些功能。FNCE => FileNet 内容引擎。
所以我围绕 COM 兼容层 DLL 创建了一个包装 VB6 类,我尝试注册活动 DLL 和活动 EXE,但是在 Excel 的 VBA 中我没有成功创建对象(myFNCE2013)(意味着我没有对象的内容) ,我确实得到了 creteObject(FNCE),因为我可以在 ObjectStore 中看到东西。那么出了什么问题呢?
我的问题是包装器坏了之后的包装器?还是因为我之前注册了相同的活动 EXE/DLL 导致问题?我用双击的方法注册,第一次看到注册成功。我有带有 SP2 的 Windows 2003 服务器,为我的 ASP 运行 IIS。
这是 IBM 对此的描述。
不支持内容引擎方法
由 Content Engine 4.x 添加到 COM 兼容层支持的对象的新方法不会在 COM 兼容层中公开。
COM API 支持但 Content Engine 4.x API 不支持的方法在 COM 兼容层接口中公开,但尝试调用这些方法将返回“不支持”错误。以下是这些方法的列表:
文件存储相关
ObjectStore.CreateFileStore
ObjectStore.ReindexFileStore
OLEDB/ADO相关
**ObjectStore.GetADOConnection**
各种各样的
**ObjectStore.FilterClassDescriptions**
ObjectStore.FilterPropertyDescriptions
如果您现有的代码使用这些 ObjectStore 属性中的任何一个,则必须基于迭代 ObjectStore.ClassDescriptions 集合或使用 ObjectStore.GetObject("ClassDescription", "") 编写自己的过滤逻辑。
这是我的调试信息。
感谢阅读到这里。我有一个丑陋的解决方案,但我仍然想听听你的聪明解决方案。我的丑小鸭是:不要再编写包装器 VB6 类,将代码放入 ASP 包含文件中,以便 ASP 页面可以使用这些功能,但是我没有 VB 类,因为 ASP 包含文件不允许这样做。这些包含文件应该能够直接调用 COM 对象。但是将类对象分解为非 OOP 功能代码?我们对类对象的思考非常舒适,非 OOP 编程对我来说似乎很简单。
Private oEntireNetwork As FNCE.EntireNetwork
Private oObjectStore As FNCE.ObjectStore
Private oUser As FNCE.user
Private sObjectStoreName As String
Private oDocument As FNCE.Document
Private sName As String
Private sSessionManager As String
Private sLogonID As String
Private ADOCnn As ADODB.Connection
Private oRtnRecordSet As New ADODB.Recordset
Public Function ActiveUser() As Variant
On Error GoTo E
Set ActiveUser = oEntireNetwork.CurrentUser
E:
If Err.Number <> 0 Then Set ActiveUser = Nothing
End Function
Public Function Users() As Variant
On Error GoTo E
Set Users = oEntireNetwork.MyRealm.Users
E:
If Err.Number <> 0 Then Set Users = Nothing
End Function
Public Function Groups() As Variant
On Error GoTo E
Set Groups = oEntireNetwork.MyRealm.Groups
E:
If Err.Number <> 0 Then Set Groups = Nothing
End Function
Private Sub Class_Initialize()
Dim iLoop
On Error GoTo E
bLogError = True
sLogErrorPath = App.Path
iDebugLevel = 1
iLoop = 0
If oEntireNetwork Is Nothing Then
Set oEntireNetwork = New FNCE.EntireNetwork
End If
If bLogError = True Then
WriteMsgToLogFile 1, "MyFNCE.ObjectStore:Class_Initialize()"
End If
E:
If Err.Number <> 0 Then
If bLogError = True Then
WriteMsgToLogFile 1, "MyFNCE.ObjectStore:Class_Initialize() -- Exception Error #" & Err.Number & ": " & Err.Description
End If
End If
End Sub
所以没有更多的类启动,我的 ASP 不能调用对象属性或函数。