1

多くの人が COM 相互運用性について議論しており、私はそれらすべてを既に読んでいます。

ケース 1: VB 6 または VBA は .NET でライブラリを使用する必要があります (私は FileNet オブジェクトを持っています。IBM は VBA で使用できる COM ラッパー DLL を既に作成しています)

http://pic.dhe.ibm.com/infocenter/p8docs/v4r5m1/index.jsp?topic=%2Fcom.ibm.p8.doc%2Fdeveloper_help%2Fupg_custom_apps%2Fce_com_api.htm )

ケース 2: .NET ソース コードで COM/COM+ オブジェクト クラスを使用する必要がありますが、これは私のケースではありません。

したがって、私の場合はケース 1 です。ジェネリックを扱う必要はありません (「ジェネティクスと COM 相互運用機能が混在しない」を参照してください。この記事ではリフレクションを使用して問題を解決していますが、非常に遅いです。現在、C# 4.0 では動的が方法です。 go (100 倍高速) http://www.west-wind.com/weblog/posts/2007/Jul/10/Generics-and-COM-Interop-dont-mix )

別のラッパーを作成する必要があるのはなぜですか? IBM の文書によると、.NET ライブラリの制限により ADOConnection はサポートされていません。また、別の関数が使用できないため (以前のバージョンでは使用可能であったため、ASP が呼び出します)、独自の関数を生成する必要があります。

関数 FilterClassDescriptions (バリアントとしての ByVal ObjType、バリアントとしてのオプションの FilterType) としてのバリアント

FileNet のラッパー COM DLL は、.NET DLL にコンパイルされた FNCE のクラスを使用します。.NET は ADOConnection をサポートしていないため、一部の機能はサポートされていません。しかし、私の ASP はこれらの関数に依存しています。FNCE => FileNet コンテンツ エンジン。 FileNet ObjectStore クラス

そのため、COM 互換レイヤー DLL の周りにラッパー VB6 クラスを作成し、アクティブな DLL とアクティブな EXE の両方を登録しようとしましたが、VBA for Excel では createObject(myFNCE2013) が正常に作成されませんでした (オブジェクトの内容がないことを意味します)。 、 ObjectStore にあるものを見ることができるので、creteObject(FNCE) を正しく取得しました。それで、何がうまくいかなかったのですか?

私の質問は、ラッパーが悪い後のラッパーです?? または、問題を引き起こしている同じアクティブな EXE/DLL を以前に登録したためですか? ダブルクリック方式で登録したところ、初めて登録に成功しました。SP2 を適用した Windows 2003 サーバーを使用しており、ASP 用に IIS を実行しています。 ここに画像の説明を入力

ここに画像の説明を入力

これについてのIBMの説明は次のとおりです。

サポートされていないコンテンツ エンジン メソッド

COM 互換性レイヤーでサポートされるオブジェクトに Content Engine 4.x によって追加された新しいメソッドは、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ページがそれらの関数を使用できるようにしますが、ASPインクルードファイルでは許可されていないため、VBクラスがありません。これらのインクルード ファイルは、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 は、オブジェクトのプロパティや関数を呼び出すことができません。

4

1 に答える 1

0

私はそれを自分で理解しました。ラッパーの周りのラッパーは問題ありません。変数を公開しないことで間違いを犯しました.VBAで使用するにはパブリックにする必要があり、デフォルトではプライベートでした.

于 2013-02-01T06:02:01.550 に答える