Реализация передачи указателя на объект через очередь сообщений

Тема в разделе "Lotus - Программирование", создана пользователем vladislav888, 1 ноя 2007.

Статус темы:
Закрыта.
  1. vladislav888

    vladislav888 Гость

    У меня есть объект(Variant). Мне надо , с помошью очереди сообщений , передать указатель на него из одного окна в другое. Я написал библиотеку с следующими обертками и классом:

    Код (Text):
    '(MAXONESEGSIZE - 0x40)
    Private Const MQ_MAX_MSGSIZE = &HF0
    ' MAXWORD
    Private Const NOPRIORITY = &HFFFF
    '"Message Queue name already in use.")
    Private Const ERR_DUPLICATE_MQ = 1024 + 97
    '"Message Queue is empty.")
    Private Const ERR_MQ_EMPTY = 1024 + 100
    '"Quit is pending on the Message Queue")
    Private Const ERR_MQ_QUITTING = 1024 + 102
    'Размер константы Variant в байтах
    Private Const VARIANT_SIZE = 16
    'Имя очереди сообщений
    Private Const mName = "C_Queue"

    Declare Function apiMQCreate Lib "nnotes.dll" Alias "MQCreate" (Byval QueueName As String, Byval Quota As Integer, Byval Options As Long) As Integer
    Declare Function apiMQOpen Lib "nnotes.dll" Alias "MQOpen" (Byval QueueName As String, Byval Options As Long, RetQueue As Long) As Integer
    Declare Function apiMQClose Lib "nnotes.dll" Alias "MQClose" (Byval Queue As Long, Byval Options As Long) As Integer
    Declare Function apiMQPut Lib "nnotes.dll" Alias "MQPut" (Byval Queue As Long, Byval Priority As Integer, Byval Buffer As Variant, Byval Length As Integer, Byval Options As Long) As Integer

    Declare Function apiMQGet Lib "nnotes.dll" Alias "MQGet" (Byval Queue As Long, Byval Buffer As Variant, Byval BufLength As Integer, Byval Options As Long, Byval timeout As Long, retMsgLength As Integer) As Integer
    Declare Function apiMQGetCount Lib "nnotes.dll" Alias "MQGetCount" (Byval Queue As Long) As Integer
    Declare Function apiOSLoadString Lib "nnotes.dll" Alias "OSLoadString" (Byval hModule As Long, Byval StringCode As Integer, Byval retBuffer As Lmbcs String, Byval BufferLength As Integer) As Integer

    Public Class C_Queue
    'Хендл на очередь сообщений
    Private hMQ As Long
    'Имя дескриптора очереди
    Private misOwner As Integer
    Private mAutoClose As Integer

    Sub New
    Dim status As Integer

    misOwner=True
    mAutoClose=True

    If Len(mName)>0 Then
    'Если имя непустое, пытаемся создать очередь сообщений с этим именем
    status= apiMQCreate(mName,NOPRIORITY,0)
    'Если очередь сообщений с таким именем уже есть,
    ' то выставляем, что владелец - не эта форма
    If status=ERR_DUPLICATE_MQ Then
    Msgbox "SCAPI Q allready exist"
    misOwner=False
    Else
    Msgbox "New SCAPI Q"
    End If     
    'Открываем очередь сообщений
    apiCall "MQOpen", apiMQOpen(mName,0,hMQ)
    End If
    End Sub


    Sub Delete
    If misOwner And mAutoClose And hMQ<>0 Then Call apiMQClose(hMQ,0)
    End Sub

    Public Property Set Message As Variant
    apiCall "MQPut:"+mName, apiMQPut(hMQ, NOPRIORITY, Message, VARIANT_SIZE, 0 )
    End Property

    Public Property Get Message As Variant
    Dim msg As Variant
    Dim ret As Integer

    apiCall "MQGet:"+mName, apiMQGet(hMQ, msg, MQ_MAX_MSGSIZE, 0, 0, ret)

    Message = msg
    End Property

    End Class

    '----------------------------------------------------------------------------
    Обработчик ошибок:

    Код (Text):
    Private Sub apiCall(apiCallName As String, Status As Integer)
    Dim Err_Mask As Integer
    Dim errorStr As String
    If Status = 0 Then Exit Sub
    Err_Mask = &H3FFF
    Status = Status And Err_Mask

    errorStr =String(255,Clng(0))
    Status = apiOSLoadString(0, Status, errorStr, Len(errorStr) - 1)
    Error Status, apiCallName + "::"+errorStr
    End Sub
    Set вроде бы проходит, Variat в очередь пихается, а вот когда пытаюсь сделать Get система вылетает. На простых текстовых сообщениях эта штука работает нормально. Подскажите, что не так?
     
  2. Sandr

    Sandr Гость

    а что говорит?
     
  3. Ronchik

    Ronchik Гость

    Для: vladislav888
    Может так
    Код (Text):
    Set Message = msg
     
  4. Sandr

    Sandr Гость

    Зачем? Message - по сути вариант... ошибку выдаст....
     
  5. Ronchik

    Ronchik Гость

    Для: Sandr
    какую ????
     
  6. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Ronchik
    Variant не обьект, SET не нужен... хотяяяя
     
  7. Sandr

    Sandr Гость

    Никаких хотяяяя... Если варианту передаем объект, тогда можно сет, иначе низя...
     
  8. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Sandr
    так в том то и дело что х.з. что в даном случае получает вариант

    имхо, проверка IsObject - может помоч, станет ясно - использовать SET или нет
     
  9. Sandr

    Sandr Гость

    Ну, насколько я понял, человек пытается передать туда масив строк... или значение какого-то там итема...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей