Автор Тема: Обмен данными между процессами  (Прочитано 19341 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #30, Отправлен: Апрель 19, 2011, 03:09:01 »
Yashied  [?]
Цитировать
вопрос в том, будет ли передаваться массив, содержащий указатели?
:'( Не передаёт.

Цитировать
Кстати, а как передать массив?
:blink: Ты это уже спрашивал, и тебе madmasles дал ссылку.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #30 Отправлен: Апрель 19, 2011, 03:09:01 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #31, Отправлен: Апрель 19, 2011, 03:12:06 »
Ты не обновил страницу. Я зачеркнул это.

:)

А вот то, что не передает, это очень плохо. Возможно есть еще какие-нибудь подводные камни...


Думай, прежде чем говорить.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #32, Отправлен: Апрель 19, 2011, 03:25:03 »
Yashied  [?]
Цитировать
указатели в массиве не передаются
Обошёл пока так:

Код: AutoIt [Выделить]
Func _Container_PutProperty($oContainer, $sVarName, $vValue, $bCheckPtrVal = False)
    If $bCheckPtrVal Then
        If IsPtr($vValue) Then
            $vValue = Number($vValue)
        ElseIf IsArray($vValue) Then
            Local $iDims = UBound($vValue, 0)
           
            If $iDims > 2 Then
                Return SetError(1)
            EndIf
           
            For $i = 0 To UBound($vValue) - 1
                If $iDims > 1 Then
                    For $j = 0 To UBound($vValue, 0) - 1
                        If IsPtr($vValue[$i][$j]) Then
                            $vValue[$i][$j] = Number($vValue[$i][$j])
                        EndIf
                    Next
                Else
                    If IsPtr($vValue[$i]) Then
                        $vValue[$i] = Number($vValue[$i])
                    EndIf
                EndIf
            Next
        EndIf
    EndIf
   
    $oContainer.PutProperty($sVarName, $vValue)
EndFunc


Медленно, криво, но вроде работает. Это надеюсь временное решение, пока не найду нормальное описание для методов объекта «InternetExplorer.Application».

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #32 Отправлен: Апрель 19, 2011, 03:25:03 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #33, Отправлен: Апрель 19, 2011, 03:38:12 »
Нашёл, это бага в AutoIt, он не может передавать указатели через COM.

#1410: Bug: Using Pointer type with COM-object throws error. (assigned)

Если спросишь как я нашёл, то довольно просто, я набрал в гугле то что выдаёт ошибка COM-обработчика:
Цитировать
Conversion of parameters failed
и попал в тему на офф. форуме, там trancexx указал на то что это бага AutoIt'а и она известная, тогда я пошёл искать по баг трекеру, и наткнулся на вышеуказанный тикет :)

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #34, Отправлен: Апрель 19, 2011, 03:41:22 »
Медленно, криво, но вроде работает.

Это не выход. Во-первых, принимающая сторона автоматически теряет тип "PTR" (вместо него приходит "INT"). Возможно будет лучше передавать преобразованный тип вместе с сигнатурой, например, если пользователь передает "PTR" (допустим 0x12345678), то фактически передается строка вида

"PTR_SIG0x12345678"

Принимающая сторона, в свою очередь, в случае прихода строкового типа, проверяет наличие сигнатуры:

Код: AutoIt [Выделить]
If (IsString($Data)) And (StringLeft($Data, 7) = "PTR_SIG") Then
    $Data = Ptr(StringTrimLeft($Data, 7))
EndIf


А во-вторых, я не уверен, что Number() переварит "PTR" в x64 (не проверял). И еще появляется ограничение на размерность массива.

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #34 Отправлен: Апрель 19, 2011, 03:41:22 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #35, Отправлен: Апрель 19, 2011, 03:45:45 »
Ох и как же я все-таки не люблю эти COM, там работает, здесь не работает...

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #36, Отправлен: Апрель 19, 2011, 04:12:40 »
Yashied  [?]
Цитировать
Во-первых, принимающая сторона автоматически теряет тип "PTR" (вместо него приходит "INT").
Ну это ведь особо не влияет на работу с ним?

Цитировать
Возможно будет лучше передавать преобразованный тип вместе с сигнатурой
Хорошая идея.

Цитировать
во-вторых, я не уверен, что Number() переварит "PTR" в x64 (не проверял)
Думаю переварит, иначе trancexx не стал бы это рекомендовать не упомянув такое ограничение, он в этом разбирается.

Цитировать
появляется ограничение на размерность массива.
Да, но не думаю что кому то понадобится интеракция с передачей 3-ёх мерного(или более) массива, я считаю это мазохизмом.

[?]
Цитировать
как же я все-таки не люблю эти COM
Да я и сам не большой любитель этого чуда :beer:

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #37, Отправлен: Июнь 06, 2011, 19:40:01 »
Наконец-то исправили проблему с передачей указателей в COM-объектах.

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #37 Отправлен: Июнь 06, 2011, 19:40:01 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2959
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Обмен данными между процессами
« Ответ #38, Отправлен: Ноябрь 06, 2012, 05:10:44 »
CreatoR
использовал твой пример с первой страницы-
http://autoit-script.ru/index.php?topic=4634.msg33451.html#msg33451
на Win 7 x64 ошибок не было. в ХР SP3 через не равные промежутки времени вываливается ошибка
The requested action with this object has failed.:
Return $oContainer.GetProperty($sName)
Return $oContainer.GetProperty($sName)^ ERROR
я так понял, что работа с объектом невозможна. с объектом к которому идет подключение. почему не сразу появляется ошибка?
пока не перезагрузишь систему скрипт не может работать
можно ли при выходе удалять объект?
« Последнее редактирование: Ноябрь 06, 2012, 07:12:21 от joiner »
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #38 Отправлен: Ноябрь 06, 2012, 05:10:44 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
12137 Просмотров
Последний ответ Сентябрь 24, 2010, 12:49:37
от LapaM
3 Ответов
2931 Просмотров
Последний ответ Август 23, 2010, 12:24:57
от axlwor
5 Ответов
4815 Просмотров
Последний ответ Март 24, 2011, 01:26:56
от Kaster
0 Ответов
1945 Просмотров
Последний ответ Март 24, 2011, 01:42:29
от Kaster
4 Ответов
4686 Просмотров
Последний ответ Март 22, 2017, 14:11:44
от mrsoros
2 Ответов
3044 Просмотров
Последний ответ Октябрь 12, 2012, 16:07:32
от ---Zak---
0 Ответов
2380 Просмотров
Последний ответ Октябрь 20, 2013, 21:56:17
от inververs
8 Ответов
4103 Просмотров
Последний ответ Июнь 26, 2014, 16:21:37
от joiner
1 Ответов
1923 Просмотров
Последний ответ Март 22, 2016, 09:53:23
от mmsgeorge
6 Ответов
1366 Просмотров
Последний ответ Декабрь 28, 2016, 20:08:18
от SNAK