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);
}
}