//---释放EXE文件----------------------------------------------
char *hmem;

DWORD size2;
//查找资源
HRSRC hRes = FindResource(NULL,MAKEINTRESOURCE(IDR_RC_EXE1),"RC_EXE");
//导入资源
HGLOBAL hgRes = LoadResource(NULL,hRes);
//锁定资源
void *pRes = LockResource(hgRes);
//得到资源大小
DWORD size = SizeofResource(NULL,hRes); //申请内存空间
hmem = (char*)malloc(size+1);
//把资源文件写入新申请的内存空间
WriteProcessMemory(GetCurrentProcess(),hmem,pRes,size,&size2);
       //创建文件
HANDLE hFile = CreateFile(m_StartFile,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
DWORD dwWrite;

//把内存中的数据写入文件
WriteFile(hFile,(void*)hmem,size,&dwWrite,0);
//关闭文件句柄
CloseHandle(hFile);
//释放资源句柄
GlobalFree(hgRes);//---把DLL文件写到EXE文件后面 //--释放DLL文件
HRSRC dRes = FindResource(NULL,MAKEINTRESOURCE(IDR_RC_DLL1),"RC_DLL");
//导入资源
HGLOBAL dgRes = LoadResource(NULL,dRes);
//锁定资源
void *dlRes = LockResource(dgRes);
//得到资源大小
DWORD dllSize = SizeofResource(NULL,dRes);
       //申请内存空间
hmem = (char*)malloc(dllSize+1);
//把DLL资源文件写入新申请的内存空间
WriteProcessMemory(GetCurrentProcess(),hmem,dRes,dllSize,&size2); //创建文件
//以只写方式打开EXE文件
HANDLE shFile = CreateFile(m_StartFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(shFile == INVALID_HANDLE_VALUE)
{
MessageBox("打开EXE文件失败");
return;
}
//把Exe文件的指针移动到文件末尾
if(SetFilePointer(shFile,0,NULL,FILE_END)==-1)
{
MessageBox("移动文件指针失败");
return;
}
WriteFile(shFile,(void*)hmem,dllSize,&dwWrite,0);
//
CloseHandle(shFile);
GlobalFree(dRes);问题:上面一段代码是将一个dll文件写在一个exe文件的末尾,捆绑成一个文件,用WriteProcessMemory函数先将数据写入内   存,然后再将内存中的数据写入文件,为什么运行后有固定的垃圾数据写在了exe后面,然后才是DLL文件。但是把释放DLL文件注视掉 释放exe文件是正常的
我是把exe文件和dll文件当作资源包含在程序里面的 当释放的时候就出现了上述的问题 
求教各位这是个怎么个状况?

解决方案 »

  1.   

    俺没调试啊,就是看您两次 malloc 都没有free,感觉不习惯,而且二进制数据,俺习惯申请unsigned char *,而不是char *
      

  2.   

    1 如果能用,你不用调查了也可以是吧
    2 不用你说的函数, 先写个程序用CFile把DLL写到EXE结尾
    在EXE启动的时候,用CFILE把DLL读出,放临时目录,
    这样就不会有任何问题,如何?
      

  3.   

    用WriteProcessMemory这个函数也是特殊环境特定用途的,4楼您说的这个方法在我这里用不了,感谢
      

  4.   

    又一个神人啊,捆绑DLL你直接连接静态库不好吗?哎,现实版的脱了库子放屁
      

  5.   

    WriteProcessMemory一般是用来写其他进程的内存的,本进程的你直接访问就行了检查你的EXE文件字节增加量,是否合dllSize相等,如果相等那么写文件没问题,你就要检查资源操作有没有问题了。
      

  6.   

    EXE文件字节的增加量就是DLL文件的大小,但是就是在EXE后面和DLL前面多了一些固定的垃圾数据,后面的DLL末尾的数据少了一些,大小就是前面垃圾数据的大小,如果是您说的那样,那是我资源释放出问题了,也有可能资源写入到内存的时候出问题了?
      

  7.   

    在EXE后面和DLL前面多了一些固定的垃圾数据——那很可能就是你续写文件的位置不对的。单独写EXE文件是正确的吗?包括大小
      

  8.   

    还有一点毛病,pRes就是数据的地方,直接传给WriteFile即可,hgRes与pRes相等,也无需GlobalFree
      

  9.   

    单独写EXE是正确的 而且文件也是完整的
    单独写DLL也是正确完整的 
    用第二个WriteProcessWrite的时候就出现了垃圾数据