把一个文件(随便的文件都行)加到工程的资源中,程序运行后想把它从程序里的资源中复制出来变成磁盘文件,请问大虾这种做法行吗?应该如何做啊??

解决方案 »

  1.   

    STUB.EXE就是资源中的文件
    HINSTANCE hInst = AfxGetInstanceHandle();    // Load the user-defined resource.
        HRSRC hExeFile = ::FindResource(hInst, "STUB.EXE", "EXE_RESOURCE");
        HGLOBAL hRes = ::LoadResource(hInst, hExeFile);
        DWORD dwSize = ::SizeofResource(hInst, hExeFile); if (hRes != NULL)
        {
    UINT FAR* lpnRes = (UINT FAR*)::LockResource(hRes);        TRY
            {
    // Create the .exe file
                CFile file(lpszFileName, CFile::modeCreate | CFile::modeWrite);            // Write the user-defined resource to the .exe file
                file.WriteHuge(lpnRes, dwSize);
                file.Flush();
            }
            CATCH(CFileException, e)
            {
    }
            END_CATCH
            ::FreeResource(hRes);
    return TRUE;
    }
      

  2.   

    用 FindResource、LockResource、CreateFile。
      

  3.   

    没必要createfile吧。直接用CFile多方便MFC提供了很好的东西不用何必呢
      

  4.   

    对了,lpszFileName是你想把资源释放的路径
      

  5.   

    EXE_RESOURCE是资源的ID吧,STUB.EXE是导入的文件名称吧
      

  6.   

    STUB.EXE是资源IDEXE_RESOURCE是资源名称,类似“Bitmap”,“Dialog”这样的东西
      

  7.   

    搞定了,谢谢zhangnanonnet(鱼欢)了。我还想问一下,有没有办法写一段代码把一些资源(也是一些文件)打包到另一个可执行文件中去呢?
      

  8.   

    可以啊。其实就按照我给你的那个方法把一些资源压缩在一起就是了,然后写一个INF文件记录这些文件的属性和大小什么的就可以了。嘿嘿,哥们,你是要自己写一个制作安装程序的程序。我做过,可惜是一份商业代码。不能给你完整的,代码了。你就安装我给你的思路去作吧。其实不难,但是挺烦的。这个问题给分给分的说
      

  9.   

    下面是将;另一个文件追加到一个文件(FILE*是文件句柄)中的程序,这样就可以像你说的把几个文件大包到一个文件中了,但是新的文件干什么用,是否还要解压出来我就不知道你要怎么作了,如果要解压,那么你需要有个临时文件存放一些信息,比如这个包中有几个文件,每个的打小,顺序。然后把这个临时文件也大包到最后,用一个特定的间隔把它与其他的文件分割(比如一个“template”这样的字符串什么的),解压的时候先解压读取这个临时文件,然后逐个操作就可以了。其实那个installshield的代码我现在也没有,只是记忆中的一些片断,不过大概的思想就是这样了。技术其实就是文件操作,有什么不明白米再问巴
    void CInstallBuilderApp::AppendFile(LPCTSTR lpszFileName, FILE* file)
    {
        FILE* inputfile;
        int ch;
        FILETIME filetime[3];
        HANDLE hFile = CreateFile(lpszFileName, GENERIC_READ,
    FILE_SHARE_READ, 0, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0 );
        if (hFile == INVALID_HANDLE_VALUE )
        {
            CString strError;
    strError.Format("File %s not found!", lpszFileName);
    AfxMessageBox(strError);
            return;
        }    GetFileTime(hFile, &filetime[0], &filetime[1], &filetime[2]);
        CloseHandle(hFile); // 'begin of file' er
    CString strTag = "{58A60076-593E-414e-8152-BD3516480CAA}";
    strTag.MakeReverse();
    // write er
        fwrite(strTag, strTag.GetLength(), 1, file);
    // write time stamps(used for restoring original time stamps)
        fwrite(filetime, sizeof(FILETIME), 3, file); // write filename
    CString strFileName = lpszFileName;
    int nPos = strFileName.ReverseFind('\\');
    if (nPos >= 0)
    strFileName = strFileName.Right(strFileName.GetLength() - nPos - 1);

        fwrite(strFileName, strFileName.GetLength() + 1, 1, file);
    // copy all bytes to setup package
        if ((inputfile = fopen(lpszFileName, "rb")) != NULL)
    {
    while ((ch = fgetc(inputfile)) != EOF) 
    fputc(ch, file);
    fclose(inputfile);
    }
    }
      

  10.   

    不过这样比较麻烦,如果可以直接以约定好的资源ID和资源名称打包进去,那访问起来也比较方便的。可以用约定好的资源ID和资源名称打包到可执行文件中去吗,然后那个程序又能够按约定好的资源ID和资源名称进行访问?
      

  11.   

    非常好的例子http://www.vckbase.com/vckbase/vckbase11/vc/nonctrls/multimedia_22/1122002.htm
      

  12.   

    嗯,看看楼上给的例子
    首先我们将各个模块作为资源加入资源中。定义整数标识和类型。这些资源文件打包将在程序运行的时候解出。 以下是从资源释放到文件的函数:
    int res2file(LPCTSTR lpName,LPCTSTR lpType,LPCTSTR filename)
    {
    //输入:lpName 为资源名,可用MAKEINTRESOURCE()宏将整型变为字符串。
    //LpType  为串类型名
    //Filename  为释放出的文件名。
    //输出:成功1,失败0
    HRSRC myres = FindResource (NULL,lpName,lpType);
    HGLOBAL gl = LoadResource (NULL,myres);
    LPVOID lp = LockResource(gl);//返回指向资源内存的地址的指针。
    // CREATE_ALWAYS为不管文件存不存在都产生新文件。
    HANDLE fp = CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);if (!fp)
    return false;
    DWORD a;
    //sizeofResource 得到资源文件的大小
    if(!WriteFile (fp,lp,SizeofResource(NULL,myres),&a,NULL)) 
    return false;
    CloseHandle(fp);
    FreeResource(gl);
    return true;
    }
    以下是调用的方法:
    res2file (MAKEINTRESOURCE(IDR_ZF),"swf","zf.swf");
    res2file (MAKEINTRESOURCE(IDR_ZG),"swf","zg.swf");
    res2file (MAKEINTRESOURCE(IDR_DOT),"acs","DOT.ACS");
    res2file (MAKEINTRESOURCE(IDR_SHARE),"dll","share.dll");
    res2file (MAKEINTRESOURCE(IDR_TALK),"dll","talk.dll");
    res2file (MAKEINTRESOURCE(IDR_SWFLASH),"ocx","swflash.ocx");
      

  13.   

    这样是不是你想要的结果,只是这样所有的文件其实都是在资源中实现IMPORT进去的,是不是显得有些呆板