WriteFile "вешает" систему

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

WriteFile "вешает" систему

Сообщение Matew » 14.11.2007 (Ср) 10:28

Суть: Хочу юзертип переводить в строку и считывать из строки обратно в юзертип(хранить юзертип в БД). Это можно сделать записывая юзертип в файл и считывая из него строку( http://bbs.vbstreets.ru/viewtopic.php?t=22072&start=30 )(может сразу предложите более цивилизованный метод), но я не хочу использовать жесткий диск, поэтому решил попробовать сделать это через Pipe-ы. в процессе изысканий возникла проблема:
WriteFile "вешает" систему. Какие параметры(флаги) нужно передать в функцию, чтобы действие программы продолжалось. В аттаче пример. Там есть кнопка, в которой несколько раз записываются и считываются данные из Pipe-а, но она не работает - зависает после первой операции записи. Как ее заставить работать?
Вложения
Server.zip
(2.7 Кб) Скачиваний: 40
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.11.2007 (Ср) 10:57

Создавай трубу с FILE_FLAG_OVERLAPPED или (хуже) PIPE_NOWAIT
Изображение

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 14.11.2007 (Ср) 11:47

tyomitch, сделал оба флага при создании
Код: Выделить всё
hPipe = CreateNamedPipe("\\.\pipe\CCC", PIPE_TYPE_BYTE Or PIPE_ACCESS_DUPLEX Or FILE_FLAG_OVERLAPPED, PIPE_NOWAIT, 10, 0, 0, 0, 0)

Попробовал еще несколько комбинаций... Не везет мне на правильные :( . Статью про пайпы прочел, вроде все должно быть правильно, а все равно "висим".
Вызываю вот так:
Код: Выделить всё
hPipe2 = CreateFile("\\.\pipe\CCC", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

Из одного и того же приложения не хочет работать :(
Пишу вот так:
Код: Выделить всё
WriteFile hPipe2, VarPtr(tpa), LenB(tpa), nWritten, 0
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.11.2007 (Ср) 14:45

Ну ага: создаёшь неждущий хэндл hPipe, а пользуешься дефолтным (ждущим) хэндлом hPipe2.

SetNamedPipeHandleState тебе в помощь.
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.11.2007 (Ср) 15:49

А если загнать в байтомассив через copymemory минуя пляски с бубном вокруг пайпов? А из него при желании можно и строку получить.
Лучший способ понять что-то самому — объяснить это другому.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 15.11.2007 (Чт) 8:15

tyomitch, не понял, что можно сделать этой функцией?
Antonariy, вот попробовал - не выходит:
Код: Выделить всё
Private Type a
    d As Long
    c() As Integer
    f As String
End Type
Dim tpa As a

Private Sub Command6_Click()
Dim arr() As Byte, i As Integer
tpa.d = 23
ReDim tpa.c(10)

For i = 0 To UBound(tpa.c())
    tpa.c(i) = Rnd * 100
Next i
tpa.f = "Пример"

ReDim arr(LenB(tpa.d) + LenB(tpa.f) + LenB(tpa.c(0)) * UBound(tpa.c()))
CopyMemory arr(0), tpa, LenB(tpa.d) + LenB(tpa.f) + LenB(tpa.c(0)) * UBound(tpa.c())
' в массив попадает куча странных цифр
'если просто написать Lend(tpa), то возвращает 12 и тогда вообще не работает
Text2.Text = arr()
End Sub

Private Sub Command7_Click()
Dim tpAb As a
Dim arr() As Byte
ReDim arr(Text2.Text)
arr() = Text2.Text
CopyMemory tpAb, arr(0), LenB(arr())
Debug.Print tpAb.d, tpAb.f, UBound(tpAb.c())
End Sub

что не так?
2 All, вот статья про все АПИ для Pipe, если кому-то интересно:
http://www.frolov-lib.ru/books/bsp/v27/ch2.htm
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.11.2007 (Чт) 9:42

Matew писал(а):tyomitch, не понял, что можно сделать этой функцией?

Повесить режим PIPE_NOWAIT на уже открытый без этой опции (как у тебя) хэндл.
Изображение

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

Сообщение Хакер » 15.11.2007 (Чт) 12:12

Matew
Советую пойти другим путём:
Код: Выделить всё

Private Declare Function SysAllocStringLen Lib "oleaut32.dll" (ByVal pData As Long, ByVal lLen As Long) As String

Private Type some_user_defined_type
    a As Long
    b As Long
    c As Byte
    d As Byte
End Type

Private Sub Form_Load()
    Dim str As String
    Dim e As some_user_defined_type
    e.a = &HE2E8F0CF 'Прив
    e.b = &H2021F2E5 'ет!
    e.c = Asc("Э")
    e.d = Asc("й")
    str = Left(SysAllocStringLen(VarPtr(e), LenB(e)), LenB(e))
    MsgBox str
End Sub
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.11.2007 (Чт) 12:13

Matew
Хм, а как же ты пишешь юзертип в файл, если у тебя строка неопределенной длины и массив Integer неопределенного размера?

В пинципе можно создать запись такого типа: 4 байта d, 1 байт - размер с(x), 2x байт - содержимое массива, 2 байта - длина f, остальное - само f.
В результате имеем:
Код: Выделить всё
Dim bOut() as Byte, i as a
dim pos as Long
Redim bOut(4 + 1 + (Ubound(i.c)+1) * 2 + 2 + len(i.f) - 1)
pos = 0
CopyMemory bOut(pos), i.d, 4
pos = pos + 4 'len(i.d)
CopyMemory bOut(pos), Ubound(i.c)+1, 1 'при условии, что размер с(x) < 255
pos = pos + 1
CopyMemory bOut(pos), i.c(0), (Ubound(i.c)+1) * 2
pos = pos + (Ubound(i.c)+1) * 2
CopyMemory bOut(pos), len(i.f), 2
pos = pos +1
CopyMemory bOut(pos), i.f, len(i.f)
Вот как-то так я бы сделал...
Лучший способ понять что-то самому — объяснить это другому.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 69

    TopList  
cron