HANDLE hResource = ::BeginUpdateResource(m_strFileName, FALSE);
    bResult = ::UpdateResource(hResource, _T("MYDATA"), MAKEINTRESOURCE(IDR_MY_DATA),
        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), pbyData, dwLen);
    bResult = ::EndUpdateResource(hResource, FALSE);// 上面每次调用,都是成功的,如果文件名是自己,虽然也会成功,但是实际结果却是资源没有改变 :(

解决方案 »

  1.   

    谢谢 azhuguang(阿朱) :)
      

  2.   

    Are you sure? Check "bResult = ::EndUpdateResource(hResource, FALSE); " sentence, whether the "bResult" is nonzero.
      

  3.   

    to elabs(洋洋):
    不知道,不代表不可以!
    程序删除自己是可行的。用修改栈的方法 UnmapViewOfFile,后执行删除操作就行了。这里的参数都是已知的。
    但是我没法用相同的方法把BeginUpdateResource的返回值传给UpdateResource和EndUpdateResource
    to Luxm(): 
    返回值确实是成功的,呵呵
      

  4.   

    to elabs(洋洋):here :) BTW: YangTze是www.vckbase.com的老大
    // ============================================
    // KillSelf.cpp - YangTze presents - 12/21/2001
    // ============================================#include "stdafx.h"#include <windows.h>typedef struct A
    {
        int a;
        char ch;
        WORD wd;
        A*    next;
    };class xx
    {
    private:
        int a;
    };int main(int argc, char* argv[])
    {    int i=sizeof(xx);    // 获取映像地址
        HINSTANCE hModule = GetModuleHandle(0);
        // 保存文件完整路径
        char buf[MAX_PATH];
        // 获取文件完整路径
        GetModuleFileName(hModule,buf,sizeof(buf));
        
        // 获取 ExitProcess/DeleteFile/UnmapViewOfFile 等 API 函数地址
        //DWORD pExitProcess=(DWORD)ExitProcess;
        //DWORD pDeleteFile=(DWORD)DeleteFileA;
        //DWORD pUnmapViewOfFile=(DWORD)UnmapViewOfFile;    // 获取 KERNEL32 模块句柄
        HINSTANCE hKernel=GetModuleHandle("KERNEL32");
        // 获取 ExitProcess/DeleteFile/UnmapViewOfFile 等 API 函数地址
        DWORD pExitProcess=(DWORD)GetProcAddress(hKernel,"ExitProcess");
        DWORD pDeleteFile=(DWORD)GetProcAddress(hKernel,"DeleteFileA");
        DWORD pUnmapViewOfFile=(DWORD)GetProcAddress(hKernel,"UnmapViewOfFile");    // 关闭文件映像句柄
        CloseHandle(HANDLE(4));    __asm
        {
            lea eax,buf                // 设置待删除文件路径
            push 0                    // 设置 ExitProcess 入口参数
            push 0                    // ExitProcess 的返回地址
            push eax                // 设置 DeleteFile 入口参数
            push pExitProcess        // DeleteFile 的返回地址
            push hModule            // 设置 UnmapViewOfFile 入口参数
            push pDeleteFile        // UnmapViewOfFile 的返回地址
            push pUnmapViewOfFile    // 下面 ret 指令的返回地址
            ret
        }
        return 0;
    }