MFC 程序自启动外部程序的问题

原创 2013年12月02日 14:37:20

方法:

//获得程序安装的路径,注册表
BOOL COpenBurnIntestDlg::GetBurnInTestInstallPath(CString&path)
{
#define INSTALL_PATH_SIZE (256)

 CStringkeyPath(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BurnInTest_is1"));
 //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\BurnInTest_is1
 DWORD ulOptions = 0L;
 HKEY hKey = NULL;
 DWORD samDesired = KEY_READ;

 if( m_bIs64bitOS )
 {
  samDesired |=KEY_WOW64_64KEY;
 }
 else
 {
  samDesired |=KEY_WOW64_32KEY;
 }


 LONG hRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyPath, ulOptions, samDesired, &hKey);
 if(hRet != ERROR_SUCCESS)
 {
#ifdef ABORT_DEBUG_TEST
  return false;
#endif
 }

 DWORD ulType = REG_SZ;
 TCHAR tcPath[INSTALL_PATH_SIZE];
 DWORD ulSize = INSTALL_PATH_SIZE;
 hRet =RegQueryValueEx(hKey,_T("DisplayIcon"),NULL,&ulType,(LPBYTE)tcPath,&ulSize);
 RegCloseKey(hKey);
 if(hRet != ERROR_SUCCESS)
 {
#ifdef ABORT_DEBUG_TEST
  return false;
#else
  CString tmp(_T("C:\\ProgramFiles\\BurnInTest\\bit.exe"));
  _tcscpy_s(tcPath,tmp.GetString());
#endif
 }

 path.Format(_T("%s"),tcPath);
 return true;
}

 

//运行程序
void COpenBurnIntestDlg::Run()
{
 CString strInstallPath;

 //获取 BurnInTest的文件路径
 if ( !GetBurnInTestInstallPath(strInstallPath))
 {
  SaveXmlResult.SaveTxt(_T("BurnInTesthas not installed yet!"));
  return;
 }

 //运行程序
 STARTUPINFO startInfo = {
  sizeof(STARTUPINFO)
 };

 PROCESS_INFORMATION processInfo;

 if( !CreateProcess( NULL,strInstallPath.GetBuffer(), NULL, NULL,
      NULL,0, NULL, NULL, &startInfo, &processInfo) )
 {
  return;
 }

 WaitForSingleObject(processInfo.hProcess,5000);
 CloseHandle(processInfo.hProcess);
 CloseHandle(processInfo.hThread);

 if( IsTheClassTimeout( WINDWO_TITLE_MAIN, 120,2L) )
 {
  return;
 }

 if( !IsTimeout( _T("Error"), 3, 1L) )
 {
  ClickButton( _T("Error"),m_ptrButtonOK );
 }

 if( !m_registrationCode.IsEmpty() )
 {
  if( !IsTimeout(WINDOW_TITLE_REGISTRATION, 18, 2L ) )
  {
   HWNDhRegistWin = ::FindWindow( NULL, WINDOW_TITLE_REGISTRATION );
   if(hRegistWin )
   {
    HWNDhRegistEdit = ::GetDlgItem(hRegistWin,WIDGET_REGISTRATION_EDITID);
    if(hRegistEdit )
    {
     ::SendMessage(hRegistEdit, WM_SETTEXT, m_registrationCode.GetLength(),(LPARAM)m_registrationCode.GetBuffer()); 
     Sleep(2000);
    }
   }
  }
 }

 ///注册界面
 if( ClickButton( WINDOW_TITLE_REGISTRATION,_T("Continue") ) )
 {
  if( IsTimeout( _T("Thanks"), 5,1L) )
  {
   if(ClickButton(_T("Invalid license information"), _T("OK")) )
   {
    SaveXmlResult.SaveTxt(_T("Invalid license information") );
    ClickButton(WINDOW_TITLE_REGISTRATION, _T("Exit BurnInTest"));
    return;
   }

   if(ClickButton(_T("Evaluation expired"), m_ptrButtonOK) )
   {
    SaveXmlResult.SaveTxt(_T("Evaluationexpired"));
    ClickButton(WINDOW_TITLE_REGISTRATION, _T("Exit BurnInTest"));
    return;
   }
  }
  else
  {
   ClickButton(_T("Thanks"), m_ptrButtonOK );
  }
 }
 

 Sleep(2000);
 //弹出一个框框
 //CUtil::ClickButton(_T("SystemInformation"),Button_OK);

 //记录 主窗体句柄
 HWND hMainWnd = ::FindWindow( WINDWO_TITLE_MAIN,NULL );
 //点击配置页面
 if( !SelectToolBarItem(hMainWnd,TOOLBAR_TEST_SELECTION_AND_DUTY_CYCLES) )
 {
  return;
 }
 //清楚所有选项 All Off
 ClickButton(WINDOW_TITLE_TEST_SELECTION_AND_DUTY_CYCLES,_T("All Off"));
 HWND hCfgWin = ::FindWindow(NULL,WINDOW_TITLE_TEST_SELECTION_AND_DUTY_CYCLES );

 //读取xml 对 BurnInTest 设置
 SetWidget(m_minutes, m_XmlRoot, hCfgWin);
 SetWidget(m_cycles, m_XmlRoot, hCfgWin);
 SetWidget(m_CPU, m_XmlRoot, hCfgWin);
 SetWidget(m_opticalDrives, m_XmlRoot,hCfgWin);
 SetWidget(m_printer, m_XmlRoot, hCfgWin);
 SetWidget(m_RAM, m_XmlRoot, hCfgWin);
 SetWidget(m_COMPort, m_XmlRoot, hCfgWin);
 SetWidget(m_tape, m_XmlRoot, hCfgWin);
 SetWidget(m_video, m_XmlRoot, hCfgWin);
 SetWidget(m_plugIn, m_XmlRoot, hCfgWin);
 SetWidget(m_2DGraphics, m_XmlRoot,hCfgWin);
 SetWidget(m_3DGraphics, m_XmlRoot,hCfgWin);
 SetWidget(m_disks, m_XmlRoot, hCfgWin);
 SetWidget(m_sound, m_XmlRoot, hCfgWin);
 SetWidget(m_network, m_XmlRoot, hCfgWin);
 SetWidget(m_parallelPort, m_XmlRoot,hCfgWin);
 SetWidget(m_USB, m_XmlRoot,hCfgWin); 

 ClickButton(WINDOW_TITLE_TEST_SELECTION_AND_DUTY_CYCLES, _T("OK") );
 Sleep(2000);

 hCfgWin = ::FindWindow( NULL,WINDOW_TITLE_TEST_SELECTION_AND_DUTY_CYCLES );
 while( hCfgWin )
 {
  if( !IsTimeout(_T("Warning -Possible conflict"), 3, 1L) )
  {
   ClickButton(_T("Warning - Possible conflict"), m_ptrButtonOK );
  }
  else
  {
   ClickButton(WINDOW_TITLE_TEST_SELECTION_AND_DUTY_CYCLES, _T("OK") );
  }

  Sleep(1000);
  hCfgWin = ::FindWindow( NULL,WINDOW_TITLE_TEST_SELECTION_AND_DUTY_CYCLES );
 }


 //ClickButton( _T("Possible permissionsproblem"), m_ptrButtonYes );
 //ClickButton( _T("Warning - Possible conflict"),m_ptrButtonOK );


 //如果测试时 选择disk 硬盘 这一选项。 则 Preferences 中 的Disk  要全部选择

 CXmlNodeWrapper xmlDisks =m_XmlRoot.GetNode(m_disks.GetXmlMark());
 if( xmlDisks.IsValid() )
 {
  SetTestPreferencesDisk(hMainWnd );
 }

 //点击 toolbar 中 的启动
 SelectToolBarItem(hMainWnd,TOOLBAR_START_SELECTED_TESTS);
 ClickButton( WINDOW_TITLE_READY_TO_RUN,m_ptrButtonOK);

 CStringstrWndTitleOXPS(WINDOW_TITLE_SAVE_PRINT_OUTPUT);
 TCHAR tcFileSaveAs[MAX_PATH] = {0};
 LoadString(NULL,OBIT_IDS_SAVE_FILE_AS,tcFileSaveAs,MAX_PATH);
 CString strWndTitleMDI(tcFileSaveAs);

 // 0x1 oxps, 0x2 mdi 0x3 both
 INT iFlag = E_SAVE_PRINT_BOTH;
 HWND hResultWnd = NULL;

 do{
  hResultWnd = ::FindWindow(NULL, WINDOW_TITLE_TEST_RESULT );

  HWND hPrint = NULL;
  
  if( iFlag &E_SAVE_PRINT_OXPS )
  {
   hPrint =::FindWindow(NULL, strWndTitleOXPS );
   if( hPrint)
   {
    iFlag= E_SAVE_PRINT_OXPS;
    SavePrintOutput(hPrint,E_SAVE_PRINT_OXPS);
   }
  }

  if( iFlag &E_SAVE_PRINT_MDI )
  {
   hPrint =::FindWindow(NULL, strWndTitleMDI );
   if( hPrint)
   {
    iFlag= E_SAVE_PRINT_MDI;
    SavePrintOutput(hPrint,E_SAVE_PRINT_MDI);
   }
  }

  Sleep(2000);

 }while( NULL == hResultWnd );


 if( E_SAVE_PRINT_BOTH != iFlag )
 {
  CStringstrWndTitle(_T(""));
  if(iFlag &E_SAVE_PRINT_OXPS)
   strWndTitle =strWndTitleOXPS;
  else
  if( iFlag &E_SAVE_PRINT_MDI )
   strWndTitle =strWndTitleMDI;

  if( !strWndTitle.IsEmpty())
   if(!IsTimeout(strWndTitle, 5, 1L) )
    SavePrintOutput(::FindWindow(NULL,strWndTitle ), iFlag);
 }


 ClickButton(WINDOW_TITLE_TEST_RESULT, _T("OK"),true);

 if( !SelectToolBarItem( hMainWnd,TOOLBAR_SAVE_RESULTS_AS_A_RESULT_LOG ) )
 {
  return;
 }


 //保存运行结果
 Sleep(1000);
 SaveBurnInTestResult();


 //Test Zhaobin
 return;
}

windows程序托盘图标以及消息提示--示例程序

之前两个博客介绍一些基本姿势,都是msdn上的,今天就介绍一下如何使用吧。为了简单起见,还是创建一个MFC based on dialog 功能吧。1创建托盘图标,封装了成一个函数:NOTIFYICO...
  • wangshubo1989
  • wangshubo1989
  • 2015年10月31日 14:56
  • 3129

设置MFC程序开机自动启动

以注册表的形式设置MFC程序开机自动启动
  • dezhihuang
  • dezhihuang
  • 2016年04月25日 16:40
  • 2581

基于MFC对话框编程:设置开机自启动

基于MFC对话框编程:设置开机自启动
  • dezhihuang
  • dezhihuang
  • 2015年11月02日 22:45
  • 630

基于MFC编写Windows服务程序

近期由于项目需要,编写了一个基于MFC对话框的Windows服务程序,现把方法和大家分享一下,希望高手指正。程序实现的基本功能如下: 1、 注册为Windows服务程序,随系统启动 2、 作为服务...
  • zhangxi8211
  • zhangxi8211
  • 2016年03月17日 16:22
  • 908

MFC笔记 启动其他外部exe程序实现

windows环境,要实现如图所示的功能,在自己开发的程序中启动其他的应用程序。 该功能的实现中,可以使用两种方式: 函数一:WinExec 该函数只提供对16位机子的兼容。应用...
  • sky_person
  • sky_person
  • 2014年02月12日 15:39
  • 2294

VC中调用并获取外部程序输出

VC上调用外部程序的方法大家应该很熟悉,比如ShellExecute,CreateProcess。 例子: system("D://adb.exe devices >c://temp.txt");...
  • zwlhoho
  • zwlhoho
  • 2015年11月13日 15:47
  • 1591

mfc学习-程序自启动

一、创建自启动复选框     在一个mfc工程中创建一个复选框控件,命名为IDC_AUTOSTART。接着创建该复选框控件的控件型关联变量,命名为m_autostart。再创建一个按钮控件,用于点击时...
  • u011110151
  • u011110151
  • 2016年04月14日 13:29
  • 263

MFC 打开外部EXE文件的三种方法

2010年07月30日    目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了《vc中调用其他应用程序的方法(函数) winexec,s...
  • gexiaochuan122
  • gexiaochuan122
  • 2013年11月24日 15:10
  • 9540

MFC窗体中打开第三方exe程序到指定区域

流程如下: 1、CreateProcess创建外部EXE进程 2、获取指定区域的坐标 3、查找进程的主窗口 4、将外部程序移到指定区域 5、调用ShowWindow显示窗口 主程序如下: han...
  • tfygg
  • tfygg
  • 2016年04月17日 20:15
  • 2208

linux程序开机自启动的方法详解~程序自动启动~Myself

1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在 /etc/rc或 /e...
  • Shb_derek
  • Shb_derek
  • 2013年01月10日 11:38
  • 15962
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 程序自启动外部程序的问题
举报原因:
原因补充:

(最多只允许输入30个字)