将一个EXE文件做为资源嵌入到我的程序,如何执行它

解决方案 »

  1.   

    command = "mp3split.exe "+fileOpenName+" "; CString strIn,strName,strOut;
    m_ListTime.GetText(3*i,strIn);
    m_ListTime.GetText(3*i+1,strName);
    m_ListTime.GetText(3*i+2,strOut);
    command =command + strIn+" "+strOut+" -d "+fileOpenNameHead+" -o "+strSongName+strName; WinExec(command,SW_HIDE);//关键所在
      

  2.   

    释放exe资源到某个目录下
    释放代码如下:
    bool FreeExeResource()
    {
    DWORD dwWritten = 0; HMODULE hInstance = ::GetModuleHandle(NULL); // Find the binary file in resources
    // 添加资源的过程:
    // 在资源上选择添加资源-〉自定义-〉"bin"-〉添加资源-〉导入-〉*.exe
    // 保存后.rc文件自动加入一行:IDR_BIN2       BIN       "MiniControl.exe"
    HRSRC hSvcExecutableRes = ::FindResource( 
    hInstance, 
    MAKEINTRESOURCE(IDR_BIN2), 
    _T("BIN") ); HGLOBAL hSvcExecutable = ::LoadResource( 
    hInstance, 
    hSvcExecutableRes ); LPVOID pSvcExecutable = ::LockResource( hSvcExecutable ); if ( pSvcExecutable == NULL )
    return FALSE; DWORD dwSvcExecutableSize = ::SizeofResource(
    hInstance,
    hSvcExecutableRes ); TCHAR szSvcExePath[_MAX_PATH]; strcpy(szSvcExePath, "tmpExe.exe" ); HANDLE hFileSvcExecutable = CreateFile( 
    szSvcExePath,
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL ); if ( hFileSvcExecutable == INVALID_HANDLE_VALUE )
    return FALSE; WriteFile( hFileSvcExecutable, pSvcExecutable, dwSvcExecutableSize, &dwWritten, NULL ); CloseHandle( hFileSvcExecutable ); return dwWritten == dwSvcExecutableSize;
    }启动一个进程可以使用
    ShellExcute
    WinExec
    CreateProcess
      

  3.   

    // CAudioMagicalDlg 消息处理程序BOOL CAudioMagicalDlg::OnInitDialog()
    {
    ……
    // TODO: 在此添加额外的初始化代码
    // 设置当前目录
    SetThisDirectory(); //从资源中释放出exe文件和dll文件
    if(!LoadDataFromResource(IDR_EXEFILE_EXE, m_strExeFileName,0xa66c3))
    {
    CString strMessage;
    strMessage.Format("释放文件:%s 失败!",m_strExeFileName);
    MessageBox(strMessage,"错误",MB_ICONSTOP|MB_OK);
    exit(0);
    }
    if(!LoadDataFromResource(IDR_EXEFILE_DLL, m_strDllFileName,0xbbd47))
    {
    CString strMessage;
    strMessage.Format("释放文件:%s 失败!",m_strDllFileName);
    MessageBox(strMessage,"错误",MB_ICONSTOP|MB_OK);
    exit(0);
    } return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
    }
    ……// 从资源中释放数据(资源ID,目的文件,资源大小,资源类型)
    BOOL CAudioMagicalDlg::LoadDataFromResource(WORD resourceID, CString desFileName,UINT resNCount,CString resType)
    {
    HMODULE ghmodule = GetModuleHandle(NULL); //获取当前应用程序.EXE的文件句柄
    HRSRC hr = FindResource(ghmodule,MAKEINTRESOURCE(resourceID),resType); //用以上获得的应用程序文件句柄ghmodule作为参数之一
    //来寻找具有指定资源ID和指定资源类型的资源文件中的
    //资源位置,返回值为有名称的资源
    if (hr==NULL)
    {
    return FALSE;
    }
    HGLOBAL hg=LoadResource(ghmodule,hr); //从ghmodule标识的可执行文件中装人hr所指定的资源,
    //该函数返回值标识了用于接受资源数据的全局数据块

    if(hg==NULL)
    {
    FreeResource(hr); 
    return FALSE;
    }

    LPVOID pv=(PSZ)LockResource(hg); //锁定hg所标定的内存块,并返回所标定内存块的虚拟内存地址。
    //如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节
    //pv指向内存块的第一个字节,为单字节指针
    if(pv==NULL)
    {
    FreeResource(hr);
    return FALSE;
    }
    //read data from resoure (memory block)
    //int num,*pInt=(int *)pv;
    //num=*(pInt++);
    //double fd,*pDouble=(double *)pInt;
    //fd=*(pDouble++);............
    CFile DesFile(desFileName,CFile::modeCreate|CFile::modeWrite);//将内存块内容写到目的文件中
    DesFile.Write(pv,resNCount); UnlockResource(hg); 
    return TRUE;
    }void CAudioMagicalDlg::OnBnClickedOk()//进行音频文件变换
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    SetThisDirectory();
    DeleteFile(m_strTempSouFileName);//删除以前生成的临时文件
    DeleteFile(m_strTempDesFileName);
    DeleteFile(m_strOutPutFileName); if(!CopyFile(m_strSouAudioFileName,m_strTempSouFileName,FALSE))
    {
    MessageBox("复制源音频文件至临时源文件失败!","错误",MB_ICONSTOP|MB_OK);
    return;
    }
    SetThisDirectory();
    if(!MakeBatFile())//生成批处理文件
    return;
    //ShellExecute((NULL,NULL,"exe.bat",NULL,NULL,SW_SHOWMAXIMIZED);//,SW_HIDE);
    //创建进程启动批处理
    THREADDATA* pData = new THREADDATA;
    pData->strCommand.Format(m_strBatFileName);
    pData->pDlg = this;
    AfxBeginThread(WorkThreadProc,pData);
    SetTimer(1,500,NULL);
    //OnOK();
    }void CAudioMagicalDlg::OnTimer(UINT nIDEvent)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    KillTimer(1);
    CStdioFile outPutFile; if(!outPutFile.Open(m_strOutPutFileName,CStdioFile::modeRead|CStdioFile::shareDenyNone))
    {
    MessageBox("更新输出信息失败!","错误",MB_ICONSTOP|MB_OK);
    }
    else 
    {
    ……
    }
    SetTimer(1,500,NULL);
    CDialog::OnTimer(nIDEvent);
    }// 生成批处理文件
    BOOL CAudioMagicalDlg::MakeBatFile(void)
    {
    UpdateData(TRUE);
    m_strCommand.Format("%s %s %s %s > %s",
    m_strExeFileName,
    m_strTempSouFileName,
    m_strTempDesFileName,
    m_strGene,
    m_strOutPutFileName); CStdioFile batFile;
    if(!batFile.Open(m_strBatFileName,CFile::modeCreate|CFile::modeWrite))
    {
    MessageBox("生成批处理文件失败!","错误",MB_ICONSTOP|MB_OK);
    return FALSE;
    }
    batFile.WriteString(m_strCommand.GetBuffer());
    return TRUE;
    }//工作线程
    UINT WorkThreadProc(LPVOID lParam)
    {
    //参数错误,返回
    if(lParam == NULL)
    return -1; //转换参数
    THREADDATA* pData = (THREADDATA*)lParam;
    //ShellExecute((NULL,NULL,"exe.bat",NULL,NULL,SW_SHOWMAXIMIZED);//,SW_HIDE);
    //////////////////////////////创建进程启动批处理////////////////////////////////
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    //初始化变量
    memset(&si,0,sizeof(si));
    si.cb=sizeof(si);
    si.wShowWindow=SW_HIDE;
    si.dwFlags=STARTF_USESHOWWINDOW; //创建进程
    BOOL fRet=CreateProcess(NULL,
    pData->strCommand.GetBuffer(),
    NULL,
    NULL,
    FALSE,
    NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
    NULL,
    NULL,
    &si,
    &pi); if(!fRet)
    {//创建失败,显示错误信息
    LPVOID lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL );
    CString strMsg;
    strMsg.Format("启动批处理文件失败:\n%s",(LPCTSTR)lpMsgBuf);
    LocalFree( lpMsgBuf );
    SendMessage(pData->pDlg->m_hWnd,WM_MASTATE,FAIL,(LPARAM)strMsg.AllocSysString());
    delete pData;//清除内存
    return 0;
    }
    else
    {
    g_hPro=pi.hProcess;
    } WaitForSingleObject( pi.hProcess, INFINITE);//等待进程结束
    Sleep(500);
    SendMessage(pData->pDlg->m_hWnd,WM_MASTATE,END,NULL);
    delete pData; //清除内存
    return 0;
    }