管道在 Windows 7 上的 WinApi 中不起作用,但在 Windows 10 上起作用

Val*_*lcu 1 c++ windows winapi windows-7 windows-10

我在 winapi 中做了一个服务器和一个客户端。

客户端发送一个数字和一个基数,服务器返回该基数中的数字。 Windows7 错误 我的问题是它在 Windows 10 中有效,但在 Windows 7 中无效,我不明白为什么。一些帮助?

客户:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <assert.h>
#include <windows.h>
#include <string>

#define BUFFSIZE 512
using namespace std;


int main()
{
    LPDWORD bytesRead = 0;
    char res[50];
    int num, base;

    LPCTSTR Roura = TEXT("\\\\.\\pipe\\pipeline");
    HANDLE h = CreateFile(Roura, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


    while (true) {
        for (int i = 0; i < 50; i++) {
            res[i] = 0;
        }
        printf("Number: ");
        cin >> num;
        WriteFile(h, &num, sizeof(int), NULL, NULL);
        if (num == 0) {
            CloseHandle(h);
            return 0;
        }
        printf("Base: ");
        cin >> base;
        WriteFile(h, &base, sizeof(int), NULL, NULL);
        ReadFile(h, res, BUFFSIZE, bytesRead, NULL);
        cout << res << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

服务器:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <assert.h>
#include <windows.h>
#include <string>

#define _CRT_SECURE_NO_WARNINGS
#define BUFFSIZE 512
using namespace std;


int main()
{
    int num, base;
    LPDWORD bytesRead = 0;
    char result[50];
    char end[] = {"\0"};

    LPCTSTR Roura = TEXT("\\\\.\\pipe\\pipeline");

    HANDLE h = CreateNamedPipe(Roura, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, BUFFSIZE, BUFFSIZE, 0, NULL);


    assert(h != INVALID_HANDLE_VALUE);

    if (!ConnectNamedPipe(h, NULL)) return -1;

    while (true) {
        ReadFile(h, &num, BUFFSIZE, bytesRead, NULL);
        if (num == 0) {
            CloseHandle(h);
            return 0;
        }
        ReadFile(h, &base, BUFFSIZE, bytesRead, NULL);
        _itoa(num, result, base);
        WriteFile(h, result, strlen(result), NULL, NULL);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

RbM*_*bMm 5

#define BUFFSIZE 512
int num, base;
LPDWORD bytesRead = 0;
ReadFile(h, &num, BUFFSIZE, bytesRead, NULL);
Run Code Online (Sandbox Code Playgroud)

此代码完整的错误。需要使用

int num, base;
DWORD bytesRead;
ReadFile(h, &num, sizeof(num), &bytesRead, NULL);
Run Code Online (Sandbox Code Playgroud)

反而。崩溃得更快bytesRead== 0

什么时候

如果 lpOverlapped 为 NULL,则 lpNumberOfBytesRead 不能为 NULL。

然而这在win7上是正确的,但是在win10上 - 系统让有lpNumberOfBytesRead == 0- 所以这里没有崩溃

还有这个

WriteFile(h, &num, sizeof(int), NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

再次 - 这里已经只有 1 个错误比较ReadFile调用

如果 lpOverlapped 为 NULL,则 lpNumberOfBytesWritten 不能为 NULL。

为什么 ?

它适用于 Windows 10,但不适用于 Windows 7

这是因为从 win 8.1 开始(如果我没记错的话ReadFile/ WriteFilechecklpNumberOfBytes参数的代码,如果它==0没有分配给它实际读取或写入的字节数。但是在windows 7系统上不做这个检查并无条件地按0地址写入数据