请问:VC编译时生成EXE文件时,自动加入校验值

请教:VC编译时生成EXE文件时,自动加入校验值
最近在做程序,程序中增加了自校验的功能,美中不足的一点是,VC生成可执行程序时,不能自动在生成的EXE文件中加入校验值,
C/C++ code

    if (MapFileAndCheckSum(Fn,&HeadChKsum,&ChKsum)!=CHECKSUM_SUCCESS)
    {
        MessageBox(NULL,"Check error!","Error",MB_OK);
    }
    else
    {
        if(HeadChKsum!=ChKsum)         //原始校验和与计算出来的校验和不一样,则有改动
            MessageBox(NULL,"File changed.","Warning",MB_OK);
    }


默认时,生成的EXE校验区的值为0,
我自己只能重新写一个程序来查找到该区域,写入校验值,感觉不是很专业。

请教各个大虾指点下,怎样让VC在编译时自动写入校验值。我已经通过GOOGLE,baidu找遍了,都没有相关资料。

------解决方案--------------------
不懂不懂。。。。。。。。。。。。
------解决方案--------------------
关注,帮UP
------解决方案--------------------
帮顶,关注下

------解决方案--------------------
/release 参数?
------解决方案--------------------
校验值是你自己定义的?还是说利用了PE结构中的校验值部分?
------解决方案--------------------
友情up
------解决方案--------------------
一般都是用MD5或者CRC来检验数据完整性的,这里给出另一中办法,

当我们完成一个工程,编译成可执行文件后,一般是不希望这个可执行文件被人改动的,那么这里就讲述一下这是如何做到的。

其实这并不难,只要一个API函数就可以完成,这就是MapFileAndCheckSum。这个函数的作用是1)映象文件,2)从映象文件中接受原始的校验和,它是在编译时有编译器写入文件的,3)计算文件的校验和。如果文件在编译后被改动,那么原始的校验和就会和计算得出的校验和不同,由此可知文件被改动。下面的程序中,HeadChksum是原始的校验和,Chksum是计算得出的校验和,最后比较他们是否相同来判断文件是否被改动。

在VC里要使用这个函数,首先要连上imagehlp.lib这个库,然后在Project->Settings->Link中去掉 Generate debug info和Link incrementlly选项,再选择Category组合框的Customize,去掉Use program database选项,最后在Project Options中加入"/release",一切OK!

#include <windows.h>
#include <imagehlp.h>

int main(int argc, char* argv[])
{
DWORD HeadChksum = 1, Chksum = 0;
char Fn[512];

GetModuleFileName( GetModuleHandle(NULL), Fn, 512 );

if(MapFileAndCheckSum(Fn,&HeadChksum,&Chksum) != CHECKSUM_SUCCESS)
{
MessageBox(NULL, "Check error!", "Error", MB_OK);
}
else if(HeadChksum != Chksum)
{
MessageBox(NULL, "File changed.", "Warning", MB_OK);
}

return 0;
}
------解决方案--------------------
实例:VC++程序自校验的简单方法http://www.diybl.com/ 2008-6-18  网络 点击:86  [ 评论 ]


在Project->Settings->Link中去掉Generate debug info和Link incrementlly选项,再选择Category组合框的Customize,去掉Use program database选项,最后在Project Options中加入"/release",一切OK!

#include <imagehlp.h>
#pragma comment(lib, "imagehlp.lib")

bool CheckExeSum()
{
char Fn[512];
DWORD HeadChksum = 1, Chksum = 0;

GetModuleFileName(GetModuleHandle(NULL), Fn, 512);
if(MapFileAndCheckSum(Fn, &HeadChksum, &Chksum) != CHECKSUM_SUCCESS)
{
return false;
}
else if(HeadChksum != Chksum)
{
return false;
}

return true;
}
 

文章出处:http://www.diybl.com/course/3_program/vc/vc_js/2008618/126148.html