Я использую CreateNamedPipe. Он возвращает 0XFFFFFFFF, но когда я вызываю GetLastError и perror, я получаю «NO ERROR».
Я проверил https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server, и я кодировал очень похоже.
Я закодировал это с использованием приведенного здесь примера: { ссылка } = , и он говорит, что это означает ERROR_PATH_NOT_FOUND (3). Но мой адрес - "\\. \ Pipe \ pipe_com1. Обратите внимание, что StackOverflow, кажется, удаляет лишние косые черты, но вы увидите их в вставке моего кода.
Я следовал примеру здесь: Создать Именованный канал C ++ Windows, но я все еще получаю ошибку. Вот мой код:
// Create a named pipe
// It is used to test TcpToNamedPipe to be sore it it is addressing the named pipe
#include <windows.h>
#include <stdio.h>
#include <process.h>
char ch;
int main(int nargs, char** argv)
{
if (nargs != 2)
{
printf("Usage pipe name is first arg\n");
printf("press any key to exit ");
scanf("%c", &ch);
return -1;
}
char buffer[1024];
HANDLE hPipe;
DWORD dwRead;
sprintf(buffer, "\\\\.\\pipe\\%s", argv[1]);
hPipe = CreateNamedPipe((LPCWSTR)buffer,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists...
1,
1024*16,
1024*16,
NMPWAIT_USE_DEFAULT_WAIT,
NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
//int errorno = GetLastError();
//printf("error creating pipe %d\n", errorno);
perror("");
printf("press any key to exit ");
scanf("%c", &ch);
return -1;
}
while (hPipe != INVALID_HANDLE_VALUE)
{
if (ConnectNamedPipe(hPipe, NULL) != FALSE) // wait for someone to connect to the pipe
{
while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE)
{
/* add terminating zero */
buffer[dwRead] = '\0';
/* do something with data in buffer */
printf("%s", buffer);
}
}
DisconnectNamedPipe(hPipe);
}
return 0;
}
Я предполагаю, что указатель на адрес может быть неправильным, и CreateNamedPipe не видит имя трубы правильно. Поэтому я использовал разборку и заметил, что адрес на самом деле является дальним указателем. Вот эта разборка:
00CA1A45 mov esi,esp
00CA1A47 push 0
00CA1A49 push 0
00CA1A4B push 4000h
00CA1A50 push 4000h
00CA1A55 push 1
00CA1A57 push 0
00CA1A59 push 3
00CA1A5B lea eax,[buffer]
00CA1A61 push eax
00CA1A62 call dword ptr [__imp__CreateNamedPipeW@32 (0CAB00Ch)]
Может кто-нибудь заметить мою проблему?