Использование Collection в COM сервере

fedotxxl

Создали COM сервер, в котором в коллекцию можно положить и взять объекты. Таким образом можно передавать объекты между программами. Проблема в том, что если создать свой класс и попытаться его туда положить выдается ошибка "Object variable not set" (13). Как решить?Я так понимаю, что мой класс необходимо "зарегистрировать". Как это сделать? Спасибо =)
10 ответов

fedotxxl

> Автор: fedotxxl> Создали COM сервер, в котором в коллекцию можно положить и взять объекты. Таким образом можно передавать объекты > между программами. Проблема в том, что если создать свой класс и попытаться его туда положить выдается ошибка "Object > variable not set" (13). Как решить?без кода, врядли что-то получится.Так что ошибка в 17 строке> Я так понимаю, что мой класс необходимо "зарегистрировать". Как это сделать? Спасибо =)А вот этого совсем не понял, созданный СОМ сервер естесвенно нужно регистрировать. Если он в длл то regsvr32, если в ехе , то /installserver(кажется так) или ты о чем?


fedotxxl

Код сервера
VERSION 1.0 CLASSBEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObjectENDAttribute VB_Name = "ObjCollection"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = TrueAttribute VB_PredeclaredId = FalseAttribute VB_Exposed = ********** Function Add(Obj As Variant, key As String) As VariantOn Error GoTo ErrAdd Add = True Call col.Add(Obj, key) Exit FunctionErrAdd: Add = FalseEnd FunctionPublic Function Item(key As String) As VariantOn Error GoTo ErrItem Set Item = col.Item(key) Exit FunctionErrItem: Set Item = NothingEnd FunctionPublic Function Remove(key As String) As VariantOn Error GoTo ErrRemove Remove = True Call col.Remove(key) Exit FunctionErrRemove: Remove = FalseEnd FunctionPublic Function Count() As LongOn Error GoTo ErrCount Count = col.Count Exit FunctionErrCount: Count = **** FunctionPublic Sub About() MsgBox "DuChan Object Collection"End Sub
Как используем
Dim db As NotesDatabasedim container as variantSet db = ns.currentDatabaseSet container = CreateObject("DCN_Obj.ObjCollection")Call container.Add(a, "string")
Работает. Пояснение - db - класс, который был написан в системе изначально (дело в том, что Visual Basic (достаточно старая его версия) используется как встроенный язык в системе, на нем реализованы изначально некоторые классы).Если сделать так
Class myClassEnd Classdim a as myClassSet a = new myClassSet container = CreateObject("DCN_Obj.ObjCollection")Call container.Add(a, "myClass")
Не работает, выдает ошибку


fedotxxl

Variant - это вам не Object


fedotxxl

Variant - это вам не Object
Это ты про что? Про "dim container as variant"? Все нормально работает в такой конструкции


fedotxxl

Public Function Add(Obj As Variant, key As String) As Variant


fedotxxl

Переписал на
Public Function Add(Obj As Object, key As String) As Variant
Проблема осталась. Теперь можно передать только объекты (логично), на самописный класс ругается


fedotxxl

так у вас не выйдетвам надо свою собственную коллекцию использовать на основе своего универсального класса


fedotxxl

Еще нет инициализации коллекции внутри класса переносчика


fedotxxl

VERSION <b>1</b>.<b>0</b> CLASS
BEGIN
MultiUse = -<b>1</b> 'True
Persistable = <b>0</b> 'NotPersistable
DataBindingBehavior = <b>0</b> 'vbNone
DataSourceBehavior = <b>0</b> 'vbNone
MTSTransactionMode = <b>0</b> 'NotAnMTSObject
END
Attribute VB_Name = "ObjCollection"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True

Public Function Add(Obj As Variant, key As String) As Variant
On Error GoTo ErrAdd
Add = True
Call col.Add(Obj, key)
Exit Function
ErrAdd:
Add = False
End Function

Public Function Item(key As String) As Variant
On Error GoTo ErrItem
Set Item = col.Item(key)
Exit Function
ErrItem:
Set Item = Nothing
End Function

Public Function Remove(key As String) As Variant
On Error GoTo ErrRemove
Remove = True
Call col.Remove(key)
Exit Function
ErrRemove:
Remove = False
End Function

Public Function Count() As Long
On Error GoTo ErrCount
Count = col.Count
Exit Function
ErrCount:
Count = <b>0</b>
End Function

Public Sub About()
MsgBox "DuChan Object Collection"
End Sub
Jah loves you.col даже не объявлено. Option Explicit рулит. Проблема, как мы видим, не в том, что "если создать свой класс"


fedotxxl

Упростил функцию, ошибка таже
Public Function myAdd(Obj As Variant) As Boolean MsgBox ("In!")End Function