VC编程中如何才能调用别的现存程序(如果是exe的),调用后又如何获得该程序界面上返回的结果值?求大神指教

解决方案 »

  1.   


    void CCntrlOtherPrcssDlg::OnStart() 
    {
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    //初始化变量
    memset(&si,0,sizeof(si));
    si.cb=sizeof(si);
    si.wShowWindow=SW_SHOW;
    si.dwFlags=STARTF_USESHOWWINDOW; //打开记事本程序
    BOOL fRet=CreateProcess(NULL,
    "c:\\windows\\notepad.exe c:\\autoexec.bat",
    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 );
    AfxMessageBox( (LPCTSTR)lpMsgBuf);
    LocalFree( lpMsgBuf ); }
    else
    {
    AfxMessageBox("CreateProcess成功");
    m_hPro=pi.hProcess;
    }
    }
      

  2.   

    CreateProcess 的时候,进行输入输出重定向
    或者把程序执行结果写到文件里,之后读取文件内容,如:
    system("ping www.baidu.com >temp.txt");
    之后可以读取temp.txt得到结果
      

  3.   

    晕 这个可以实现?? 至少别的程序要提供一个方法来获取,或者提供一个接口来获取。比如IE浏览器就有一个IWebBrowser接口,可以用来遍历网页中的表单,甚至可以获取输入框输入的密码。
      

  4.   

    不是啊,比如你调用ping
    system("ping www.baidu.com >temp.txt");
    之后可以读取temp.txt得到结果
    ----------------------
      

  5.   

    #2楼 得分:0回复于:2012-09-05 20:35:30CreateProcess 的时候,进行输入输出重定向
    或者把程序执行结果写到文件里,之后读取文件内容,如:
    system("ping www.baidu.com >temp.txt");
    之后可以读取temp.txt得到结果
     
     
      

  6.   

    这个问题要分情况了,如果你调用的是console(控制台)程序,可以通过管道接管其输出结果。如果是有用户界面的,就又要区分了,如果是窗口控件上显示结果,你findwindow后gettext。如果是无窗口控件,则截图,然后文字识别……。
      

  7.   

    调用exe的方法很多。
    如楼上说得可以使用CreateProcess
    或者
    CString szPath = GetCurDir() +_T("别人的.exe");
    ShellExecute(NULL, _T("open"), szPath,NULL, NULL, SW_SHOWMAXIMIZED );
    或者:
    WinExec("C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe",SW_SHOW);至于说调用后又如何获得该程序界面上返回的结果值。那也简单。
    可以首先通过遍历找到别人程序对话框的句柄。然后就可以操作对话框上的控件了,包括可以获得控件上的值,状态等等之类的信息了。 HWND oldHWnd = NULL;
    EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);    //枚举所有运行的窗口
    if(oldHWnd != NULL)
    { //AfxMessageBox("本程序已经在运行了");
    ::ShowWindow(oldHWnd,SW_SHOWNORMAL);          //激活找到的前一个程序
    ::SetForegroundWindow(oldHWnd);                //把它设为前景窗口
    return false;                                  //退出本次运行
    }BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
    {
    HANDLE h = GetProp(hwnd,g_szPropName);
    if( h == g_hValue)
    {
    *(HWND*)lParam = hwnd;
    return false;
    }
    CString str;
    TCHAR text[10];
    GetWindowTextW(hwnd,(LPWSTR)text,10);
    str.Format(_T("%s"),text);
    if (str.Compare(SOFTWEARNAME)==0)
    {
    *(HWND*)lParam = hwnd;
    return false;
    }
    return true;
    }