将一个EXE文件做为资源嵌入到我的程序,如何执行它
解决方案 »
- 我的console控制台程序,退出时提示无法正常关闭
- 一个多文档获取菜单的问题
- 串口通讯的问题
- 谁借我500可用分?以后还他550!
- 哪位朋友知道在哪里可以下载到 cegui 类库??谢谢
- 调用DLL中一个结构体的重载运算出错问题
- 我调试程序,当跟踪到::CreateThread(NULL,0,listenthread,(LPVOID)m_socket,0,&dwthread);这行时,我在listenthread线程中加断点了,为
- 窗口间控件的操作?
- 出来‘炸’道!给些建议!---新来的需要你的好建议!!
- VC中类的问题!
- 为什么switch(strT)当strT是字符串变量时不能用?
- 如何微分函数
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);//关键所在
释放代码如下:
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
{
……
// 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;
}