Передать данные(массив) из одной программы в другую

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 04.01.2010 (Пн) 21:01

Приветствую Дамы и Господа.

Ситуация:
Есть дополнительная программа, которая считывает файл, проверяет его структуру на соответствие определенным правилам и выдает отчет.
Механизм проверки раскладывает данные по массиву.
Проверяемые файлы являются служебными для основной программы, и мысль такова -
хотелось бы, чтобы основная программа могла вызвать эту дополнительную при запуске, и выполнив проверку получить с нее помимо ответа "все ок" еще и этот массив, чтобы потом еще раз не считывать и не формировать...
Но смысл в том, чтоб дополнительная программа могла работать и сама по себе, и вызванной из соновной.

Вопрос: как передать массив из одной программы в другую?

на всяк.случай - обе программы свои.
Заранее благодарен.
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передать данные(массив) из одной программы в другую

Сообщение Хакер » 04.01.2010 (Пн) 21:03

Способов: тьма.

Подробности и требования к способу --- в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 04.01.2010 (Пн) 21:10

Способ мне требуется самый простой на усмотрение предлагающего...
чтоб основная программа получила массив, любовно сформированный другой программой, которая самоубивается после отдачи массива.
Очень нуждаюсь в примере.
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передать данные(массив) из одной программы в другую

Сообщение Хакер » 04.01.2010 (Пн) 21:12

Массив чего? Злых духов?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 04.01.2010 (Пн) 21:42

Хакер писал(а):Массив чего? Злых духов?

А VB и так умеет?! ...

Вот -
Entry() as String
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передать данные(массив) из одной программы в другую

Сообщение Хакер » 04.01.2010 (Пн) 21:44

И что там внутри?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 05.01.2010 (Вт) 1:07

строки.

есть же универсальный способ?

Лучше было б конечно такой массив передавать - UDTшный

Код: Выделить всё
Type udtBaseEntry
ID as string *2
Tag as string
Text as string
Res1 as string
Res2 as string
End Type
' Структура может изменится по мере потребностей - все еще в стадии разработки
Dim Base() as udtBaseEntry


А внутри там все равно строки...

Так какие примеры по этому поводу?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передать данные(массив) из одной программы в другую

Сообщение Хакер » 05.01.2010 (Вт) 1:36

Откуда строки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 05.01.2010 (Вт) 2:01

В первом посте написано - из файла, результат его упорядочивания.
К чему столько вопросов?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Передать данные(массив) из одной программы в другую

Сообщение Andrey Fedorov » 05.01.2010 (Вт) 2:16

Wolfie писал(а):Лучше было б конечно такой массив передавать - UDTшный


Файл/майслот. Требуемое вам туда пишется/считывается очень даже элементарно.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передать данные(массив) из одной программы в другую

Сообщение Хакер » 05.01.2010 (Вт) 2:43

Wolfie писал(а):В первом посте написано - из файла, результат его упорядочивания.
К чему столько вопросов?

К тому, чтобы понять, оправдано ли использование String-переменных. Скорее всего нет.

А способов тьма: и WM_COPY, и OLE, и общая память, и пайпы, и указанные выше мэилслоты.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 05.01.2010 (Вт) 4:13

Хакер писал(а):оправдано ли использование String-переменных

смысл в том, чтобы не читать еще раз файл и не раскладывать еще раз его содержимое по массиву... масив мне нужен в основной программе.

Andrey Fedorov писал(а):Файл/майслот

Хакер писал(а):WM_COPY, и OLE, и общая память, и пайпы, и указанные выше мэилслоты

Э, спасибо за наводки, но поскольку сейчас все это для меня в равной степени пустой звук, может кто-нибудь привести простой пример, кинуть ссылку на статью или что-нибудь в этом роде?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Передать данные(массив) из одной программы в другую

Сообщение Andrey Fedorov » 05.01.2010 (Вт) 6:55

Wolfie писал(а):смысл в том, чтобы не читать еще раз файл и не раскладывать еще раз его содержимое по массиву... масив мне нужен в основной программе.


Раскладывать... чего?

Весь файл в переменную UDT типа считывается одной командой GET. Ничего раскладывать не нужно. А переменная может содержать что угодно, в том числе и массивы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Передать данные(массив) из одной программы в другую

Сообщение Twister » 05.01.2010 (Вт) 19:18

Я что-то не понял: если две программы используют одни и те же "куски кода" для получения данных, то почему бы не выделить эти куски в DLL? Тогда проблема с межпроцессовой передачей данных отпадет сама собой. Мало того, добавлю: если по каким-то причинам такой код не выйдет выделить в отдельную библиотеку, то это говорит о неверной проектировке системы в общем.
А я все практикую лечение травами...

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Все еще не нашел решения

Сообщение Wolfie » 10.01.2010 (Вс) 7:09

Andrey Fedorov писал(а):Весь файл в переменную UDT типа считывается одной командой GET.

В 1 посте написано
Wolfie писал(а):дополнительная программа...считывает файл, проверяет его структуру ...
Механизм проверки раскладывает данные по массиву.

Т.е. данные в файле хранятся в понятном для человека виде, а не в виде UDT. К тому же, в файле будет и ошибочная и лишняя (комментарии) информация, она разумеется должна отсутствовать в массиве.
Однако, это навело меня на мысль пойти самым легким путем, и просто записать массив во временный файл... Не напомните как это делается одной командой GET - не могу вспомнить...

Twister
Э, а где в итоге будет хранится этот массив? ... увы, я не понял как DLL поможет мне передать массив из одной программы в другую...
У меня была мысль хранить этот массив в классе, но и как передать класс я тоже не знаю...

Неужели у стой простой задачи столь непростое решение - я просто не могу найти толковый пример поиском... или бестолковый) но в API-Guide примеры по функциям с памятью касаются обычно всяческих убыстрений и графики, чем непосредственно например создание общей памяти и обращения к ней ,как мне показалось.
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Все еще не нашел решения

Сообщение Andrey Fedorov » 10.01.2010 (Вс) 13:29

Wolfie писал(а):
Andrey Fedorov писал(а):Весь файл в переменную UDT типа считывается одной командой GET.

Однако, это навело меня на мысль пойти самым легким путем, и просто записать массив во временный файл... Не напомните как это делается одной командой GET - не могу вспомнить...


Дык я об этом и говорил, собственно.

Пишется не массив, а переменная UDT типа содержащая массив и все что там нужно, в том числе и другие переменные UDT типа.
Примитивный пример чтения/записи:

Код: Выделить всё
Option Explicit

Private Type uTypQ
    sArr() As String
    n As Integer
End Type

Private Type uTypT
    sArr() As String
    d As Date
    qArr() As uTypQ
End Type

Public Sub Main()
    Dim sFile As String
   
    sFile = App.Path & "\Test.bin"
    On Error Resume Next
    Kill sFile
    On Error GoTo 0

    SaveT sFile
    LoadT sFile
End Sub

Private Sub SaveT(sFile As String)
    Dim t As uTypT, i As Long, j As Long, iHFile As Integer
   
    t.d = Date
    ReDim t.sArr(10)
    ReDim t.qArr(10)
   
    For i = 0 To UBound(t.sArr)
        t.sArr(i) = i & " строка i"
        t.d = Now
        With t.qArr(i)
            .n = i
            ReDim .sArr(i)
            For j = 0 To UBound(.sArr)
                .sArr(j) = i & " строка i,  " & j & " подстрока j"
            Next j
        End With
    Next i
   
    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Put #iHFile, , t
    Close #iHFile
End Sub

Private Sub LoadT(sFile As String)
    Dim t As uTypT, i As Long, j As Long, iHFile As Integer

    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Get #iHFile, , t
    Close #iHFile
   
    For i = 0 To UBound(t.sArr)
        Debug.Print t.d & "   " & t.sArr(i)
        With t.qArr(i)
            Debug.Print .n
            For j = 0 To UBound(.sArr)
                Debug.Print .sArr(j)
            Next j
        End With
    Next i
End Sub
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Передать данные(массив) из одной программы в другую

Сообщение Twister » 11.01.2010 (Пн) 11:32

Э, а где в итоге будет хранится этот массив? ... увы, я не понял как DLL поможет мне передать массив из одной программы в другую...
Мдя. Массив ни где не будет храниться, если его конечно не надо сохранять по условию задачи.
DLL не поможет передать данные из процесса в процесс, она поможет избежать необходимости в этом. Поясняю на пальцах:
Код, который "считывает файл, проверяет его структуру на соответствие определенным правилам и выдает отчет", выностится в библиотеку, в одну функцию, которая возвращает... да все равно что она возвращает (я бы возвращал указатель на вашу UDT-структуру), главное чтоб другие программы смогли нормально обработать результат. Твои две программы (дополнительная и главная) должны будут использовать для обработки данных эту DLL, т.е. главная программа сможет получить обработанные данные без вызова дополнительной. И все, что не ясно-то?
А я все практикую лечение травами...

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Передать данные(массив) из одной программы в другую

Сообщение Wolfie » 13.01.2010 (Ср) 0:17

Andrey Fedorov
Да, спасибо, мысль ясна, и все же это запасной вариант

Twister
А кстати мысль хорошая, спасибо... но программа проверки мне нужна вроде как и сама по себе тоже... и все что она делает окажется в DLL, ведь если проверка окажется неудачной при запуске основной программы, то визуальный отчет придется вывести тоже...

ибо попытки вникнуть в пайпы и майл-слоты меня не воодушевили)))

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Передать данные(массив) из одной программы в другую

Сообщение iGrok » 13.01.2010 (Ср) 1:02

Wolfie писал(а):Andrey Fedorov
Да, спасибо, мысль ясна, и все же это запасной вариант

Twister
А кстати мысль хорошая, спасибо... но программа проверки мне нужна вроде как и сама по себе тоже... и все что она делает окажется в DLL, ведь если проверка окажется неудачной при запуске основной программы, то визуальный отчет придется вывести тоже...

ибо попытки вникнуть в пайпы и майл-слоты меня не воодушевили)))

Ну значит в dll выносишь ещё и процедуру создания виз. отчёта.
А эта твоя отдельная программа будет просто оболочкой для запуска двух ф-ций этой dll.
label:
cli
jmp label

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Передать данные(массив) из одной программы в другую

Сообщение Twister » 13.01.2010 (Ср) 12:31

ибо попытки вникнуть в пайпы и майл-слоты меня не воодушевили)))
Ну конкретно для этой задачи они и не нужны. Повторюсь - моё решение является наиболее правильным в данной ситуации ( 8) ). Но для того, чтобы успешно и эффективно программировать под Win32 такие знания просто необходимы, их нельзя игнорировать.
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 24

    TopList