Код Питона
код питона (Отобразить)CODE:import time
import win32pipe, win32file
def pipe_server():
print("pipe server")
count = 0
pipe = win32pipe.CreateNamedPipe(
r'\\.\pipe\Foo',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_READMODE_MESSAGE | win32pipe.PIPE_WAIT,
1, 65536, 65536,
0,
None)
try:
print("waiting for client")
win32pipe.ConnectNamedPipe(pipe, None)
print("got client")
while count < 10:
print(f"writing message {count}")
# convert to bytes
some_data = str.encode(f"{count}")
win32file.WriteFile(pipe, some_data)
time.sleep(1)
count += 1
print("finished now")
finally:
win32file.CloseHandle(pipe)
pipe_server()
Ссылка на скрипт - тут пробелы съелись
(для просмотра ссылки Вам необходимо авторизоваться)
Взял пример из этой темы от
AdryV
CODE:external(INT, "CreateFile", "CreateFileA", "kernel32.dll");
external(INT, "ReadFile", "ReadFile", "kernel32.dll");
#define GENERIC_READ -2147483648
#define GENERIC_WRITE 1073741824
#define OPEN_EXISTING 3
#define NULL 0
string lpszPipeName="\\.\pipe\Foo";
int k;
k=CreateFile(lpszPipeName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
messagebox(k);
Запускаем pipe сервер. Запускаем кибор. Я так понимаю подключаемся к серверу. Как считать что передаёт сервер?
Сервер вещает периодически.
Из кибора периодически читаю
r=ReadFile(k, address(#Buff[0]), 1024, address(#read), 0);
Если нет нового сообщения - кибор зависает.
Какие настройки нужны или как сделать, чтобы нет сообщения - ну и ладно?
PeekNamedPipe надо использовать для проверки или есть что читать. При попытке прочитать если ничего нет - зависает. Не Кибор, а ReadFile
Ну понятно, что не конкретно кибор зависает, а из-за readfile. Буду гуглить, спасибо.
Читаю
CODE:PeekNamedPipe(k, address(#Buff[0]), 1024, address(#PiRead), address(#PiAllData), address(#PiNotRead));
первое сообщение выводится -
Buff[PiRead]=0;
format(#Buff[0])
Дальше PiAllData растёт, но как выводил первое сообщение так и выводит только его
Менял Buff[PiAllData]=0;
Вобщем запутался.
PeekNamedPipe проверять есть ли что-то в буфере, если есть, то вызвать ReadFile.
Что на винде может мешать работать pipe каналу? Питон создаёт именной канал, кибор подключается. У меня на всех компах работает. У человека нет. Я понимаю, вопрос пространный. Вдруг есть простой ответ.
Не работает создание канала или подключение к нему, не читает, не записывает? Кибор от админа запущен? Все функции возвращают код ошибки, смотрите какая именно функция не выполнилась и что вернула.
Обычно антивирусник или uac что-то блокируют, отключить их и проверить.
Из питона экзешник сделал и кибор экзешник в одной папке. Между ними pipe канал. И тот и другой запускаются, но пока в исключения виндовского антивирусника папку не внесли - pipe не давал создать. Пипец, это такая страшная вещь что-ли, что его антивирусник блочит? Причём молча.