ReadFile Win32 API

Abi*_*Ali 2 c++ winapi

我想读一个文件..但..当我调试我的程序它运行但弹出窗口说系统编程已经停止工作,并在控制台,它写道,按Enter键关闭程序.我的代码是::

// System Programming.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hin;
    HANDLE hout;
    TCHAR buff[20]= {'q','2','3'};
    TCHAR buff2[20]={'a','v'};
    hin = CreateFile(_T("Abid.txt"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hin == INVALID_HANDLE_VALUE)
    {
        cout<<"error";
    }

    WriteFile(hin,buff,40,0,NULL);
    CloseHandle(hin);

    hout = CreateFile(_T("Abid.txt"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

    if(hout == INVALID_HANDLE_VALUE)
    {
        cout<<"error";
    }

    ReadFile(hout,buff2,40,0,NULL);
    CloseHandle(hout);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Aby*_*byx 12

根据MSDN,只有当lpOverlapped参数不为NULL时,lpNumberOfBytesWritten参数才能为NULL.所以电话应该是

DWORD nWritten;
WriteFile(hin, buff, 40, &nWritten, NULL);
Run Code Online (Sandbox Code Playgroud)

DWORD nRead;
ReadFile(hout, buff2, 40, &nRead, NULL);
Run Code Online (Sandbox Code Playgroud)

另外,重命名hinhout.


Che*_*Alf 6

其他人已经回答了你的问题.这是关于代码的.

// Your code:
// System Programming.cpp : Defines the entry point for the console application.
//
Run Code Online (Sandbox Code Playgroud)

只需删除该评论即可.事实并非如此.:-) 您的程序的入口点是机器代码开始执行的地方,并且使用Microsoft工具链由/entry链接器选项指定.

请注意,Microsoft的文档通常会对入口点感到困惑,例如,它始终以某种方式记录入口点的错误签名.

它是最臭名昭着的Microsoft文档错误之一,并且,鉴于它以各种形式持续存在了15年,我认为它说了些什么(不确定到底是什么).

// Your code:
#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

您不需要此自动生成的标头.而是使用<windows.h>.包含<windows.h>在您的程序中的最小方法是

#undef  UNICODE
#define UNICODE
#include <windows.h>
Run Code Online (Sandbox Code Playgroud)

对于C++,您通常还要确保在包含之前定义STRICTNOMINMAX定义<windows.h>.使用现代工具至少STRICT是默认定义的,但确保没有坏处.没有它,一些声明将无法使用C++编译器进行编译,至少在没有重新解释强制转换的情况下,例如对话程序.

// Your code:
#include "iostream"
using namespace std;
Run Code Online (Sandbox Code Playgroud)

差不多好的.

做这个:

#include <iostream>
using namespace std;
Run Code Online (Sandbox Code Playgroud)

不同之处在于编译器搜索标头的位置.使用引用的名称,它首先在一些其他位置搜索(这就是标准所说的所有内容).对于大多数编译器,这些附加位置包括包含文件的目录.

// Your code:
int _tmain(int argc, _TCHAR* argv[])
Run Code Online (Sandbox Code Playgroud)

不好了!不要这样做.它是Microsoft"功能",有助于支持Windows 9.x. 只有在您使用动态链接的MFC并且您的目标是Windows 9.x时,它才有意义; 在图片中没有MFC,您只需使用Microsoft Unicode层.

您使用动态链接的MFC使用应用程序真正定位Windows 9.x的区域?

相反,做......

int main()
Run Code Online (Sandbox Code Playgroud)

...这是标准的,或使用Microsoft语言扩展...

int wMain( int argc, wchar_t* argv[] )
Run Code Online (Sandbox Code Playgroud)

...如果你想以"简单"的方式处理命令行参数.

// Your code:
{
    HANDLE hin;
    HANDLE hout;
    TCHAR buff[20]= {'q','2','3'};
    TCHAR buff2[20]={'a','v'};
Run Code Online (Sandbox Code Playgroud)

这些TCHAR东西只是Windows 9.x中MFC的支持.

除了完全没必要之外(可能是你真的没有针对Windows 9.x,是吗?),它隐藏了你的意图并伤害了眼睛.

你的意思是 ...

char buff[20] = {'q', '2', '3'};
Run Code Online (Sandbox Code Playgroud)

... 也许?

// Your code:
    hin = CreateFile(_T("Abid.txt"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hin == INVALID_HANDLE_VALUE)
    {
        cout<<"error";
    }
Run Code Online (Sandbox Code Playgroud)

正如其他人所提到的,OPEN_EXISTING在创建文件时不合逻辑,并且计数指针参数不能为0.

使用时<windows.h>,UNICODE如果应该定义,则应将filename参数指定为L"Abid.txt".

干杯&hth.,