用windows api 计算文件的md5值

我自己封装了一个函数GetMd5(LPCWSTR FileDirectory)。其中调用了windows api:CryptAcquireContext,CryptCreateHash,CryptHashData等。要计算不同文件的md5值,只需在调用此函数时传入不同文件的全路径即可,不需要额外的dll。示例代码在vs2008中测试通过

#include "stdafx.h"
#include <iostream>
#include "windows.h"
using namespace std;void GetMd5(LPCWSTR FileDirectory)
{HANDLE hFile=CreateFile(FileDirectory,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);if (hFile==INVALID_HANDLE_VALUE)                                        //如果CreateFile调用失败{cout<<"CreateFile go wrong :"<<GetLastError()<<endl;                //提示CreateFile调用失败,并输出错误号。visual studio中可在“工具”>“错误查找”中利用错误号得到错误信息。CloseHandle(hFile);}HCRYPTPROV hProv=NULL;if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)==FALSE)       //获得CSP中一个密钥容器的句柄{cout<<"CryptAcquireContext go wrong:"<<GetLastError()<<endl;}HCRYPTPROV hHash=NULL;if(CryptCreateHash(hProv,CALG_MD5,0,0,&hHash)==FALSE)     //初始化对数据流的hash,创建并返回一个与CSP的hash对象相关的句柄。这个句柄接下来将被CryptHashData调用。{cout<<"CryptCreateHash go wrong:"<<GetLastError()<<endl;}DWORD dwFileSize=GetFileSize(hFile,0);    //获取文件的大小if (dwFileSize==0xFFFFFFFF)               //如果获取文件大小失败{cout<<"GetFileSize go wrong:"<<GetLastError()<<endl;}byte* lpReadFileBuffer=new byte[dwFileSize];DWORD lpReadNumberOfBytes;if (ReadFile(hFile,lpReadFileBuffer,dwFileSize,&lpReadNumberOfBytes,NULL)==0)        //读取文件{cout<<"ReadFile go wrong:"<<GetLastError()<<endl;}if(CryptHashData(hHash,lpReadFileBuffer,lpReadNumberOfBytes,0)==FALSE)      //hash文件{cout<<"CryptHashData go wrong:"<<GetLastError()<<endl;}delete[] lpReadFileBuffer;CloseHandle(hFile);          //关闭文件句柄BYTE *pbHash;DWORD dwHashLen=sizeof(DWORD);//以下注释掉的代码不用使用,因为已经知道md5值就占32个字节,没有必要通过CryptGetHashParam函数来得到字节数。/*BYTE *pbHashSize;if (!(pbHashSize=(byte*)malloc(dwHashLen)))      //为pbHashSize分配内存{cout<<"memory allocation failed:"<<GetLastError()<<endl;}//将第二个参数的值设为HP_HASHSIZE。dwHashLen中存放着hash值的字节数。这个调用必须在将第三个参数设置为HP_HASHVAL的调用前,这样才能分配正确数量的内存。if (CryptGetHashParam(hHash,HP_HASHSIZE,pbHashSize,&dwHashLen,0))      {free(pbHashSize);}else{cout<<"get size go wrong"<<GetLastError()<<endl;}*/if (CryptGetHashParam(hHash,HP_HASHVAL,NULL,&dwHashLen,0))      //我也不知道为什么要先这样调用CryptGetHashParam,这块是参照的msdn       {}else{cout<<"get length wrong"<<endl;}if(pbHash=(byte*)malloc(dwHashLen)){}else{cout<<"allocation failed"<<endl;}if(CryptGetHashParam(hHash,HP_HASHVAL,pbHash,&dwHashLen,0))            //获得md5值{for(DWORD i=0;i<dwHashLen;i++)         //输出md5值{printf("%02x",pbHash[i]);}cout<<endl;}//善后工作if(CryptDestroyHash(hHash)==FALSE)          //销毁hash对象{cout<<"CryptDestroyHash go wrong:"<<GetLastError()<<endl;}if(CryptReleaseContext(hProv,0)==FALSE){cout<<"CryptReleaseContext go wrong:"<<GetLastError()<<endl;}
}int _tmain(int argc, _TCHAR* argv[])
{GetMd5(L"C:\\Windows\\System32\\kernel32.dll");system("pause");return 0;
}
此代码输出系统文件kernel32.dll的md5值,在我电脑上运行结果如下图所示:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用EnumProcesses()枚举进程

参照msdn的例子&#xff0c;用EnumProcesses&#xff08;&#xff09;枚举进程并输入进程名和句柄。以下代码在vs2008中测试通过&#xff1a; #include "stdafx.h" #include <windows.h> #include "psapi.h" #pragma comment (lib, "psapi.…

利用Tomcat运行一个JSP页面 详细步骤

1.启动Tomcat: 在Tomcat安装目录下的bin文件夹中&#xff0c;运行startup.bat批处理文件。截图如下&#xff1a; 此时会自动弹出窗口&#xff1a; 不要关闭这个窗口。 2.测试Tomcat是否启动成功。 打开浏览器&#xff0c;在地址栏中输入http://localhost:8080&#xff08;Tom…

JSP的三个编译指令-page,include详解

JSP的编译指令是通知JSP引擎的消息。 常见的编译指令有三个&#xff1a; page&#xff1a;该指令是针对当前页面的指令。 include&#xff1a;用于指定如何包含另一个页面。 tablib&#xff1a;用于定义和访问自定义标签。 编译指令格式如下&#xff1a; <% 编译指令…

计算机基础:计算机网络-socket编程

来源&#xff1a;mooc大学华南理工大学计算机网络课程 chapter6 代码&#xff1a;https://github.com/NeilKeats/SocketDemo/commit/5f3a795250a95339106ed741b4355a9c6c3d39e9 1.设计原理&#xff1a;CS系统 2.如何使用&#xff1a; 3.TCP通信的socket例子&#xff1a;文件传输…

JSP的9个内置对象-application

JSP页面中包含9个内置对象&#xff0c;这9个内置对象都是Servlet API的类或者接口的实例&#xff0c;只是JSP规范将它们完成了默认初始化&#xff0c;即它们已经是对象&#xff0c;可以直接使用。 application&#xff1a;javax.servlet.ServletContext的实例&#xff0c;该实…

JSP的7个动作指令-forward指令

forward指令用于将页面响应控制转发给另外的页面。既可以转发给静态的HTML页面&#xff0c;也可以转发到动态的JSP页面&#xff0c;或者转发到容器的Servlet。 JSP的forward指令格式如下&#xff1a; 对于JSP1.0&#xff0c;使用如下语法&#xff1a; <jsp:forward page&q…

JSP的9个内置对象-request

request&#xff1a;javax.servlet.http:HttpServletRequest的实例&#xff0c;该对象封装了一次请求&#xff0c;客户端的请求参数都被封装在该对象里。获取客户端请求参数必须使用该对象。常用的方法有getParameter(String paramName), getParameterValues(String paramName)…

算法图解学习笔记02:递归和栈

计算机内存原理 要说递归和栈的问题&#xff0c;首先就要说下计算机内存的基本原理。简单理解计算机内存原理可以将一台电脑看作超市的存包柜&#xff0c;每个柜子都有柜号&#xff08;即计算机中的地址&#xff0c;如0x000000f&#xff09;。当需要将数据存储到计算机中时&…

JSP的9个内置对象-response

response代表服务器对客户端的响应。大部分时候&#xff0c;程序无须使用response来响应客户端请求&#xff0c;因为有个更简单的响应对象-out。它是页面输出流&#xff0c;是JstWriter的实例。JspWriter是Writer的子类&#xff0c;Writer是字符流&#xff0c;无法输出非字符内…

JSP的9个内置对象-session

session代表一次用户会话&#xff0c;其含义是&#xff1a;从客户端浏览器连接服务器开始&#xff0c;到客户端浏览器与服务器断开为止&#xff0c;这个过程就是一次会话。 session通常用于跟踪用户的会话信息&#xff0c;如判断用户是否登录系统&#xff0c;或者在购物车应用中…

JavaScript-Tool:jquery.qrcode.js

ylbtech-JavaScript-Tool&#xff1a;jquery.qrcode.js1.返回顶部 1、插件描述&#xff1a;jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 &#xff0c;使用它可以很方便的在页面上生成二维条码。如何使用它 将jquery.qrcode.min.js和jquery添加到您的…

通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~

通通玩blend美工&#xff08;8&#xff09;——动态绘制路径动画&#xff0c;画出个萌妹子~ 原文:通通玩blend美工&#xff08;8&#xff09;——动态绘制路径动画&#xff0c;画出个萌妹子~2年前我在玩Flex的时候就一直有一个疑问&#xff0c;就是如何来实现一个蚊香慢慢烧完的…

HTML 超链接

1.如何创建html超链接 <html> <body> <p> <a href"http://www.baidu.com" > website link</a> </p></body> </html>点击后跳转到baidu主页 2.超链接的title属性 <html> <body> <p> <a href&q…

用户注册信息实例

index.jsp用来接收用户输入的表单&#xff0c;其代码如下&#xff1a; <html> <body><form action"result.jsp" method"post"> 用户名&#xff1a;<input type"text" name"username"><br> 密码&#xf…

JSP调用request方法获取请求相关信息

index.jsp&#xff1a; <html> <body bgcolor"#FFFFF0"> 请求方式&#xff1a;<%request.getMethod() %><br> 请求的资源&#xff1a;<%request.getRequestURI() %><br> 请求用的协议&#xff1a;<%request.getProtocol() %&…

JSP实例-定时刷新页面

<html> <body> now the time is:<br> <% out.println(""new Date().toLocaleString()); //response对象中添加一个响应头&#xff0c;页面每20秒刷新一次 response.setHeader("Refresh","20");%> </body> </ht…

codeforces 540D Bad Luck Island (概率DP)

题意&#xff1a;会出石头、剪刀、布的人分别有r,s,p个&#xff0c;他们相互碰到的概率相同&#xff0c;输的人死掉&#xff0c;问最终活下去的人是三种类型的概率 设状态dp(i,j,k)为还有i个石头&#xff0c;j个剪刀&#xff0c;k个布时的概率&#xff0c;dp(r,s,p)1.0 状态转移…

jsp示例-response页面重定向

用户输入用户名和密码&#xff0c;如果用户名和密码分别是admin 和123&#xff0c;就重定向到success.jsp页面&#xff0c;否则重定向到登录页面。 index.jsp&#xff1a; <html> <body> 登录<br> <form action"next.jsp" method"post&qu…

day_01 解析简单的程序

就以上一节FirstProgram为例&#xff0c;请看下图&#xff1a;01、AndroidManifest.xml是整个项目的配置文件&#xff0c;非常重要&#xff0c;每个应用程序里必须存在的xml文件&#xff0c;且名字不可以改变&#xff0c;四大组件的使用必须在此处声明注册才可使用&#xff0c;…

时区与程序设计

时区的定义 我们使用经纬度[1]来标识地球上的任意一个点。 理论时区 不像纬度有赤道作为自然的起点&#xff0c;经度没有自然的起点而使用经过伦敦格林尼治天文台旧址的子午线作为起点。 理论时区的宽度是15&#xff0c;所以一共有 360 / 15 24 个时区&#xff0c;一天有 24 小…