Вопрос: Именованные каналы и API | Добавлено: 09.06.06 15:44 |
Автор вопроса: ![]() |
Ребята,подскажите ,чё за фигня!
Создал ехе-шник для работы с именованными каналами (на API),а он в интерпретаторе работает, в p-code работает,а если в машинных компилирую ,то при вызове последней функции нафиг выходит сразу! Может встречалась фигня такая у кого? У меня второй раз такой случай. '*************** (Чтение данных (клиентом)) ***************************** 'проверка наличия данных tmpResult = PeekNamedPipe(hPipe&, 0, 0, lpBytesRead&, lpTotalBytesAvail&, lpBytesLeftThisMessage) 'если нет данных ->0 If lpTotalBytesAvail = 0 Then Exit Sub если есть - прочитать канал ( он уже открыт ) tmpResult = ReadFile(hPipe, TempStr, lpTotalBytesAvail, lpBytesRead, 0) 'Здесь-то и произошёл глюк ! |
Ответы | Всего ответов: 16 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 1876 ![]() |
Профиль | Цитата | #1 | Добавлено: 09.06.06 16:14 |
И что, как объявлен второй параметр у ReadFile? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 22 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 09.06.06 17:27 |
lpBuffer as Any Я много чё пробовал,даже адреса памяти передавал, пробовал по значению Вот штука - в p-code компилируется нормально, а в машинный не хочет |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 1876 ![]() |
Профиль | Цитата | #3 | Добавлено: 09.06.06 17:30 |
Ну и что мы хотим, передавая в такой параметр сроку byref? |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 22 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 09.06.06 17:40 |
Функция записывает данные в строку lpBuffer из очереди канала.
Да это буфер. С функцией _lRead всегда работало для файлов. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 09.06.06 21:47 |
А этот TempStr где-нибудь инициализируется? Или ты пихаешь здоровый кусок по ее адресу и думаешь, что он ничего не затрет? |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 09.06.06 22:22 |
Может, по ходу ещё многопоточность юзаешь? У меня были такие глюки при программировании оной на vb6. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 1876 ![]() |
Профиль | Цитата | #7 | Добавлено: 10.06.06 04:51 |
Функция записывает данные в строку lpBuffer из очереди канала.
Да это буфер. С функцией _lRead всегда работало для файлов. Повторю вопрос. Ты в курсе, что строки-буферы надо передавать byval, а ты передаёшь byref? |
Номер ответа: 8 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #8 | Добавлено: 10.06.06 08:47 |
Кроме того, что ByVal, надо ещё и буфер достаточного размера передавать
dim TempStr as string
TempStr = String(lpTotalBytesAvail, vbNullChar) tmpResult = ReadFile(hPipe, ByVal TempStr..... |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 22 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 12.06.06 17:48 |
Чуваки ,извините,я тут долго за компом не был. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 22 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 12.06.06 17:52 |
Расскажу по порядку TempStr Больше нигде не используется,инициализуруется в начале функции . Буфер только если по значению пенредавать,его адрес же функция не узнает и не сможет записать туда строку? А вот что касается функции String,сейчас попробую |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 1876 ![]() |
Профиль | Цитата | #11 | Добавлено: 12.06.06 18:09 |
Буфер только если по значению пенредавать,его адрес же функция не узнает и не сможет записать туда строку?
Учить матчасть. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 22 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 12.06.06 18:18 |
Попробую. Я про API читал только книжку Д.Эпплмана |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 13.06.06 21:29 |
Это только придурочный паскаль, если ему не указать явно, что строка должна передаваться по ссылке, положит ее в стек. VB при передаче как ByVal конвертит свой BSTR (юникод, по оффсету -4 размер) в ANSI (символ - 1 байт, на конце \0) и кладет в стек ее адрес. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 22 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 24.06.06 14:05 |
Да там вабще не Уникод,а уродство какое-то возвращается. Чё там за формат,как эту хрень в АНСИ конвертить? |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 25.06.06 00:26 |
Как выглядит это уродство? |
|