VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 146|回复: 7

[原创] 《C/C++ Windows 程序设计》 输出贴

[复制链接]
74_avatar_middle
最佳答案
0 
在线会员 发表于 2021-11-18 10:45:11 | 显示全部楼层 |阅读模式
学习《C/C++ Windows 程序设计》的第三天


        编译环境:Windows10    VS2019

        学习目的:熟练掌握API运用,错误问题查找

        API函数:
                1、DeleteFile          -> 可以使用 DeleteFile 删除指定存在的文件

                2、CopyFile          -> 可以使用 CopyFile 拷贝指定存在的文件到目标路径文件

                3、MoveFile        -> 可以使用 MoveFile 移动一个已存在的文件或者文件夹到新的位置

                4、CreateFile        -> 创建或打开文件或 I/O 设备。常用的 I/O 设备有:文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带

                                                驱动器,通信资源,邮筒和管道。

                5、CloseHandle        -> 关闭一个内核对象

                6、GetFileSize | GetFileSizeEx  ->该函数用于获取指定文件的大小(长度),以字节为单位[两者区别:文件大小,以4GB为分界]

        API学习思路:
               
                在无法确认使用哪个API函数的情况,利用Baidu搜索引擎搜索“关键字”[功能] + “API函数”,在搜索结果中找到所需的的函数。

                查阅API函数介绍,注意查看一下内容:

                        1、各参数含义跟功能;

                        2、该函数所在的库文件;

                        3、使用函数的例子;

                        4、查看返回值,以便确认我们调用函数后完成的结果;

                        5、利用GetLastError()函数,查询错误码,在利用VS菜单栏中“工具”->“错误查找”->输入错误码,查看结果

                实例操作:GetFileSize | GetFileSizeEx

                步骤一:

                        创建新项目,同之前项目设置

                A.文件小于4GB的情况下使用GetFileSize()

                代码如下:
                #include <Windows.h>
                #include <tchar.h>
                #include <iostream>

                int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, INT nCmdShow)
                {
                        //需要打开文件的名,注意转译字符
                        LPCSTR szFileName = "D:\\wps\\WPS Office\\ksolaunch.exe";
                        //以只读的方式打开文件,并获取文件句柄
                        HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
                        if (hFile != INVALID_HANDLE_VALUE)
                        {
                                //文件打开成功的情况
                                //文件大小确认小于4GB,第二参数设置为NULL
                                DWORD dwFileSize= GetFileSize(hFile, NULL);
                                //格式化输出
                                TCHAR szFileSize[128] = { 0 };
                                _stprintf(szFileSize,"文件大小:%d",dwFileSize);
                                MessageBox(NULL, szFileSize, "提示", MB_OK);
                                CloseHandle(hFile);
                        }
                        else
                        {
                                MessageBox(NULL, "打开文件失败", "提示", MB_OK);
                                DWORD dwErr = GetLastError();
                                TCHAR szErr[128] = { 0 };
                                _stprintf(szErr, "错误代码:%d", dwErr);
                                MessageBox(NULL, szErr, "提示", MB_OK);
                        }



                        return 0;
                }

                这次编译过程比较曲折,以后得加强规则性:

                1、变量要确认是否正确,把szFileName与szFileSize弄错调试好久都是错,数据类型的不同;

                2、CreateFile的第5个参数设置成“CREATE_NEW”后 调试一直是“打开文件失败”,测试GetLastError(),返回值0,

                一阵雾水,后来调整为“OPEN_EXISTING”,就OK了,还是不能偷懒,需要了解各个参数值得含义。

                B.文件大于4GB 使用GetFileSize(),需运动第二个参数

                        1.设置变量

                                DWORD dwFileSizeHigh=0;

                        2、将GetFileSize的第二参数设置为&dwFileSizeHigh,取地址;

                        3、设置变量

                        LONGLONG lFileSize=(((LONGLONG)dwFileSizeHigh)<<32)|dwFileSize;

                        4、输出“lFileSize”

                大于4GB使用GetFileSizeEx()

                GetFileSizeEx()为GetFileSize()的延伸函数,但是GetFileSizeEx(),第二个参数是PLARGE_INTEGER结构体,并且函数的

                返回值为BOOL类型,文件的大小在结构体中进行查找。

                                                                                                                                        2021年11月18日
               

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
00_avatar_small oyxbl + 1 + 1 感谢分享!

查看全部评分





上一篇:《C/C++ Windows 程序设计》 输出贴
下一篇:《C/C++ Windows 程序设计》 输出贴
74_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-18 10:54:30 | 显示全部楼层
补充:
编译过程中出现“错误        C4996        'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        获取文件大小        D:\C++\实例\获取文件大小\获取文件大小\获取文件大小.cpp        18        ”
解决方案:
工程属性 -> C/C++ -> 预处理 -> 预处理器定义 ->编辑 -> 添加“_CRT_SECURE_NO_WARNINGS”
00_avatar_middle
最佳答案
11 
在线会员 发表于 2021-11-18 10:59:56 | 显示全部楼层
火钳刘明
《C/C++ Windows 程序设计》 输出贴
75_avatar_middle
最佳答案
22 
online_supermod 发表于 2021-11-18 11:28:32 | 显示全部楼层
夜风来袭 发表于 2021-11-18 10:54
补充:
编译过程中出现“错误        C4996        'sprintf': This function or variable may be unsafe. Consider usi ...

#pragma warning(disable:4996)   你在头文件哪里下次试试这个,会不会比在属性中修改方便些,这中问题一般是出现在用了和编译器不同版本得函数,如早期得函数在新得编译器如2019中会出现警告,但是在2015或者vc6.0中并不会出现!
74_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-18 12:22:49 | 显示全部楼层
wl1383838438 发表于 2021-11-18 11:28
#pragma warning(disable:4996)   你在头文件哪里下次试试这个,会不会比在属性中修改方便些,这中问题一 ...

是的,测试调试成功了 我的查查原理
74_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-18 12:24:57 | 显示全部楼层
wl1383838438 发表于 2021-11-18 11:28
#pragma warning(disable:4996)   你在头文件哪里下次试试这个,会不会比在属性中修改方便些,这中问题一 ...

谢谢指教!
75_avatar_middle
最佳答案
22 
online_supermod 发表于 2021-11-18 14:30:44 | 显示全部楼层
夜风来袭 发表于 2021-11-18 12:22
是的,测试调试成功了 我的查查原理

我个人得理解是(纯属个人理解非官方)禁用连接警告  然后后面的是4996意思大概就是忽略或者禁用4996得警告

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
00_avatar_small oyxbl + 1 + 1 活到了

查看全部评分

25_avatar_middle
最佳答案
0 
在线会员 发表于 2021-11-19 17:23:08 | 显示全部楼层
很不错学习了~
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-11-30 02:11

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表