MFC加载exe资源,程序调用exe功能

本文介绍如何将已编译的exe程序作为资源导入MFC对话框程序中,并通过代码调用该exe程序,实现无需将exe程序放入硬盘即可运行的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、工程B为基于MFC对话框程序,先插入已经存EXE(或DLL)文件到VC资源文件中,如下图:

 

    A、切换到资源视图,在上面单机右键:

 insert

 

    B、单击"Import...",找到刚刚工程A编译生成的MsgBox.exe文件:

 import

 

    C、设置导入的资源类型名,这个名称将是该函数的第三个参数,我们取资源类型名为EXE:

 custom type

 

    D、此时,资源视图中多了一个类型为:EXE,资源ID为:IDR_EXE1,如下图:

 res view

 

 

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



 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值