Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Помогите разобраться. Ошибка в COM передаче данных Добавлено: 06.12.05 03:42  

Автор вопроса:  Андрей
Добрые люди!
Помогите, пожалуйста, разобраться, почему не срабатывает передача данных через RAISEEVENT и STRUCRURE в приложение VB6

Файл Class2.vb

Option Strict Off
Option Explicit On
Imports System.Math
Imports System.Runtime.InteropServices
<ComClass(class2.ClassId, class2.InterfaceId, class2.EventsId)> Public Class class2
#Region "COM GUIDs"
    ' Эти GUIDS обеспечивают тождество общей объектной модели на этот класс и его
    ' интерфейсы общей объектной модели. Если Вы изменяете их, существующие клиенты
    ' больше не будут способны обратиться к классу.
    Public Const ClassId As String = "04E1391A-2B59-4bb4-9714-901EBC468A64"
    Public Const InterfaceId As String = "EE70F101-5373-45c3-8479-0EC3333BAA2A"
    Public Const EventsId As String = "707F4954-B000-4dd8-A5C5-659642470896"
#End Region
#Region "Public"
    ' Создаваемый COM класс должен иметь подпрограмму Public Sub New() без
    ' параметров, иначе класс не будет зарегистрирован в системном реестре
    ' общей объектной модели и не может быть создан через CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub
    <ComRegisterFunction()> Public Shared Sub OnRegistration(ByVal T As Type)
        MsgBox("Библиотека " & T.FullName & " зарегистрирована!!!")
    End Sub
    Public Structure Criteria
        Public A As Double
        Public F As Double
        Public P As Double(,)
    End Structure
    Public Event ORDER(ByRef ORDERNUM As Integer(), ByRef ORDERDEN As Integer(), ByRef RESIDUALDISPERSION As Double(,), ByRef IQ As Integer, ByRef IP As Integer)

    Public Sub I(ByRef H As Double(), ByRef IQ As Integer, ByRef IP As Integer)
        Dim ordernum(5), orderden(5) As Integer
        Dim rd(1, 5) As Double
        Dim i, j As Integer

        For i = 0 To 1
            For j = 0 To 5
                If i = 0 Then
                    ordernum(i) = j
                    rd(i, j) = j
                Else
                    orderden(i) = 2 * j
                    rd(i, j) = 2 * j
                End If
            Next
        Next
        IQ = 5
        IP = 10
        RaiseEvent ORDER(ordernum, orderden, rd, IQ, IP)
    End Sub
    Public Function T(ByRef P As Double(), ByVal G As Double) As Criteria
        Dim rd(1, 5) As Double
        Dim i, j As Integer

        For i = 0 To 1
            For j = 0 To 5
                If i = 0 Then
                    rd(i, j) = j
                Else
                    rd(i, j) = 2 * j
                End If
            Next
        Next
        ' Сформировать выходные данные
        With T
            .A = 15
            .F = 1235
            .P = rd
        End With
    End Function
#End Region
End Class


Файл AssemblyInfo.vb

Imports System
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic.ErrObject

' General Information about an assembly is controlled through the following
' set of attributes. Change these attribute values to modify the information
' associated with an assembly.

' Review the values of the assembly attributes

<Assembly: AssemblyTitle("")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("")>
<Assembly: AssemblyCopyright("")>
<Assembly: AssemblyTrademark("")>
<Assembly: CLSCompliant(True)>

'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid("981DCABA-10FE-4bcf-9917-71BB149ED732")>

' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version
'      Build Number
'      Revision
'
' You can specify all the values or you can default the Build and Revision Numbers
' by using the '*' as shown below:

<Assembly: AssemblyVersion("1.0.*")>
' Если атрибут ComVisiblе равен True, все открытые объекты и члены классов будут
' доступны при регистрации сборки для использования в СОМ. Тем не менее атрибут
' ComVisiblе позволяет управлять видимостью отдельных элементов сборки. Например,
' если установить атрибут ComVisible(False) для метода класса, этот метод нельзя
' будет вызвать из СОМ.
<Assembly: ComVisible(True)>

' Если присвоить атрибуту ClasslnterfасеТуре значение None, то при экспортировании
' библиотеки типов интерфейс IDispatch не будет сгенерирован как интерфейс по
' умолчанию, что позволит назначить для всех объектов сборки интерфейс, определенный
' вами. Не беспокойтесь, возможность позднего связывания при этом не теряется, поскольку
' определяемый вами интерфейс по умолчанию будет двойственным.
<Assembly: ClassInterface(ClassInterfaceType.None)>/CODE]

В проекте Vb6 следующий код:

[CODE]Option Explicit
Dim WithEvents class As class2
Attribute class.VB_VarHelpID = -1

Private Sub class_ORDER(ORDERNUM() As Long, ORDERDEN() As Long, RESIDUALDISPERSION() As Double, IQ As Long, IP As Long)
    Debug.Print UBound(ORDERNUM), IQ, IP
End Sub

Private Sub Command1_Click()
Dim H() As Double, IQ As Long, IP As Long
    Call C.I(H, IQ, IP)
    ' Вызова class_ORDER не происходит!!!!!!!!!!!!!!!!!
End Sub

Private Sub Command2_Click()
    Dim A As Criteria, P() As Double, G As Double
    
    On Error GoTo 1
    A = C.T(P, G) ' Вызывается ошибка о нехватке памяти для передачи структуры данных!!!!!!!
    With A
        Debug.Print "A=" & .A
        Debug.Print "F=" & .F
        Debug.Print UBound(.P)
    End With
    Exit Sub
1   MsgBox Err.Description
End Sub

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 06.12.05 16:48
Что такое C и где она объявлена?

Ответить

Номер ответа: 2
Автор ответа:
 Андрей



Вопросов: 1
Ответов: 4
 Профиль | | #2 Добавлено: 07.12.05 03:29
Переменная C объявляется в модуле для возможности обращения к классу

Attribute VB_Name = "Модуль1"
Option Explicit

Public C As New ClassLib.class2

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 07.12.05 10:38
А withevents где?

Ответить

Номер ответа: 4
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 07.12.05 11:17
А толку от withevents если он объявил переменную в модуле... :))

Ответить

Номер ответа: 5
Автор ответа:
 Андрей



Вопросов: 1
Ответов: 4
 Профиль | | #5 Добавлено: 07.12.05 18:35
Я уже писал:
В проекте Vb6 следующий код:

Option Explicit
Dim WithEvents class As class2

Ответить

Номер ответа: 6
Автор ответа:
 Андрей



Вопросов: 1
Ответов: 4
 Профиль | | #6 Добавлено: 07.12.05 18:37
Могу прислать файлы проекта на EMAIL

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 08.12.05 13:07
Я уже писал:
В проекте Vb6 следующий код:


Option Explicit
Dim WithEvents class As class2

А где присвоение значения переменной class, ты случаем не писал? А то я как-то пропустил.

Ответить

Номер ответа: 8
Автор ответа:
 Андрей



Вопросов: 1
Ответов: 4
 Профиль | | #8 Добавлено: 09.12.05 02:58
В VB6 в меню Проект > Информация задается ссылка на ClassLib.tlb ---- это и есть присвоение

Ответить

Номер ответа: 9
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #9 Добавлено: 09.12.05 08:16
Да ну???

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам