程序运行后给自身可执行文件写入一个字符串变量,如何做???

解决方案 »

  1.   

    太复杂,我记得DOS 的时候程序文件有一段可以自己改写,不知道还有没有更简单的办法,
    其实这个初衷是想程序自己收集计算机的硬件资料,然后写到程序本身,用于防拷贝,
    也不知道有没有其他更简单适用的方拷贝的办法!
      

  2.   

    简单的方法只有这样子,先创建一个备份文件,然后你的程序把东西写到备份里,接着生成一个.BAT文件,.BAT文件的功能就是删掉你原来的程序并且启动备份程序。在你程序退出的时候启动.BAT,.BAT是可以将你的程序删掉的。现在很多程序自杀就是这样做的。
      

  3.   

    楼主的意思是想要防止盗版,因此想将全局唯一信息(每台机子的标识)写入.exe文件中,那么完全不用将信息加入进.exe文件,而应该预先留出一块空间,以后再填写那块空间。不可以运行时给自己写信息,因为.exe文件被系统用FILE_SHARE_READ的标志打开,禁止改写其内容。而且楼主只是想将唯一信息写入.exe,即只需写入一次(以后每次执行都是在同一台机子上)。所以应该再编一个小程序,在安装程序中调用,以将全局唯一信息写入已安装到客户机子上的.exe。至于在.exe中预留空间,可以创建一个节(section),将一个表示全局唯一信息的结构的全局实例放到这个节中,再在辅助程序中利用SDK提供的帮助函数即可很方便的修改这个节的内容了,现举个辅助程序的例子供楼主参考:#include <windows.h>
    #include <Imagehlp.h>
    #include <iostream>struct TEMPSTRUCT
    {
        float a;
        ULONG b;
        float c;
    };  // 楼主应将这里替换成表示全局唯一信息的结构////下面这一段用于生成节,楼主应将其放在主程序中/////////////
    ////这里只是例子,真正的辅助程序中应该去掉此段///////////////
    #pragma section( "Private", read )
    __declspec( allocate( "Private" ) ) TEMPSTRUCT g_Temp;
    /////////////////////////////////////////////////////////////#pragma comment( lib, "Imagehlp.lib" )int main()
    {
        std::cout << g_Temp.a << " " << g_Temp.b << " " << g_Temp.c << std::endl;    LOADED_IMAGE image;
    // 这里的c:\a.exe楼主在实际的辅助程序中应通过安装程序转成主程序的路径名
        if( !::MapAndLoad( "a.exe",
                           "C:\\",
                           &image,
                           FALSE,
                           FALSE ) )
            return -1;    for( ULONG i = 0; i < image.NumberOfSections; ++i )
            if( !::lstrcmp( reinterpret_cast< LPSTR >( image.Sections[ i ].Name ),
                            "Private" ) )
            {
                TEMPSTRUCT *pTemp = reinterpret_cast< TEMPSTRUCT* >(
                    image.MappedAddress + image.Sections[ i ].PointerToRawData );        // 这里应使用楼主自定的全局唯一信息生成函数来将生成的信息写入.exe
                pTemp->a = 0.345f;
                pTemp->b = 234;
                pTemp->c = 43.43f;
                break;
            }    DWORD header = 0, file = 0;
        ::MapFileAndCheckSum( "C:\\a.exe", &header, &file );
        image.FileHeader->OptionalHeader.CheckSum = file;
        ::UnMapAndLoad( &image );    return 0;
    }将编译生成后的.exe考到C:\下,重命名为a.exe,再运行未重命名前的.exe,再运行a.exe即可看见a.exe已经被修改。
    至于上面所用到的函数及结构,楼主可参考MSDN。不过此小技若用于防盗版,那等于没有