转载:https://blog.csdn.net/lekonpeng/article/details/4150464
当我们完成一个工程,编译成可执行文件后,一般是不希望这个可执行文件被人改动的,那么这里就讲述一下这是如何做到的。
其实这并不难,只要一个API函数就可以完成,这就是MapFileAndCheckSum。这个函数的作用是
1)映象文件。
2)从映象文件中接受原始的校验和,它是在编译时有编译器写入文件的。
3)计算文件的校验和。
如果文件在编译后被改动,那么原始的校验和就会和计算得出的校验和不同,由此可知文件被改动。
下面的程序中,HeadChksum是原始的校验和,Chksum是计算得出的校验和,最后比较他们是否相同来判断文件是否被改动。
需要修改工程属性,在此用VS2012为例
第一步:C/C++ ---->General ---> Program Database(/Zi)
第二步:Linker ---> General ----> Enable Incremental Linking 设置为NO
第三步:Linker ---> Advanced ---> Set Cheksum 设置为Yse
测试工程:
#include <iostream> #include <windows.h> #include <Imagehlp.h> #pragma comment(lib,"imagehlp.lib") int main() { DWORD HeadChksum=1,Chksum=0; TCHAR text[512]; GetModuleFileName(GetModuleHandle(NULL),text,512); if (MapFileAndCheckSum(text,&HeadChksum,&Chksum) != CHECKSUM_SUCCESS) { MessageBox(NULL,L"Check error!",L"Error",MB_OK); } else { if (HeadChksum!=Chksum) { MessageBox(NULL,L"File changed.",L"Warning",MB_OK); } else { MessageBox(NULL,L"File No changed.",L"tip",MB_OK); } } return 0; }