1、工程B为基于MFC对话框程序,先插入已经存EXE(或DLL)文件到VC资源文件中,如下图:
A、切换到资源视图,在上面单机右键:
B、单击"Import...",找到刚刚工程A编译生成的MsgBox.exe文件:
C、设置导入的资源类型名,这个名称将是该函数的第三个参数,我们取资源类型名为EXE:
D、此时,资源视图中多了一个类型为:EXE,资源ID为:IDR_EXE1,如下图:
2.输入代码:
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), _T("EXE"));
DWORD dwSize = SizeofResource(NULL, hRes);
HGLOBAL hGlobal = LoadResource(NULL, hRes);
LPVOID lp = LockResource(hGlobal);
按F7 Built你的工程之后,FileView视图就会出现MsgBox.exe
这样就把外部的exe程序引进入到MFC工程了,剩下的,你就可以使用调用EXE的方法使用了。
eg:system("msgbox.exe");
之后按CTRL+F5,你生成的exe程序运行它就包含了msgbox.exe的功能,无需把msgbox.exe程序放到硬盘中,通过程序去调用它了,它是可以单独存在的。
完整的代码如下:
void CMFCRunExeResourceDlg::OnOK() { // TODO: Add extra validation here try { HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE2), _T("EXE")); if(NULL == hRes) return ; DWORD dwSize = SizeofResource(NULL, hRes); if(0 == dwSize) return ; HGLOBAL hGlobal = LoadResource(NULL, hRes); if(NULL == hGlobal) return ; LPVOID lp = LockResource(hGlobal); if(NULL == lp) return ; CFile file; // TCHAR szApp[MAX_PATH] = {_T("D:\\wentaoli\\VCProgramm\\ping1.exe")}; TCHAR szApp[MAX_PATH] ="ping1.exe"; file.Open(szApp, CFile::modeCreate | CFile::modeWrite); file.Write(lp, dwSize); file.Close(); FreeResource (hGlobal); if(PathFileExists(szApp)) { STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {0}; if(CreateProcess(NULL, szApp , NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } } } catch (CException* e) { e->ReportError(); e->Delete(); } // CDialog::OnOK(); } ////////////////////////////////////////////////////////////////////// // 1.Click the right mouse button in Dialog,select import // 2.select xxx.exe program,Resource type input "exe", // 3.Build program,switch to FileView window,will see xxx.exe in the tree structure. ////////////////////////////////////////////////////////////////////// void CMFCRunExeResourceDlg::OnButton1() { // TODO: Add your control notification handler code here HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), _T("EXE")); DWORD dwSize = SizeofResource(NULL, hRes); HGLOBAL hGlobal = LoadResource(NULL, hRes); LPVOID lp = LockResource(hGlobal); CFile file; // TCHAR szApp[MAX_PATH] = {_T("D:\\wentaoli\\VCProgramm\\ping1.exe")}; TCHAR szApp[MAX_PATH] ="Winsock_getIP.exe"; file.Open(szApp, CFile::modeCreate | CFile::modeWrite); file.Write(lp, dwSize); file.Close(); FreeResource (hGlobal); STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {0}; if(CreateProcess(NULL, szApp , NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } }