Добрые люди!
Помогите, пожалуйста, разобраться, почему не срабатывает передача данных через 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
Ответить
|