zoukankan      html  css  js  c++  java
  • C++ 中调用其他应用程序的方法

    http://yulv.net/archives/20/

    三个SDK函数 WinExecShellExecuteCreateProcess 实现调用其他程序的方法

    三个SDK函数: WinExec, ShellExecute,CreateProcess 可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。

    WinExec 两个参数,前一个指定路径,后一个指定显示方式。
    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
    CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。

    三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:

    WinExec

    这个函数最简单,只有两个参数,原型如下:
    UINT WinExec(
    LPCSTR lpCmdLine, // 命令路径
    UINT uCmdShow // 显示方式
    );


    使用方法如下:
    WinExec("Notepad.exe", SW_SHOW); // 打开记事本
    WinExec("D:Program FilesTestTest.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
    需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。

    ShellExecute

    原型如下:
    HINSTANCE ShellExecute(
    HWND hwnd, //父窗口句柄
    LPCTSTR lpOperation, //操作, 打开方式 "edit","explore","open","find","print","NULL"
    LPCTSTR lpFile, //文件名,前面可加路径
    LPCTSTR lpParameters, //参数
    LPCTSTR lpDirectory, //默认文件夹
    INT nShowCmd //显示方式
    );


    使用方法如下:
    ShellExecute(NULL,"open","C:Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:Test.txt 文件
    ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com
    ShellExecute(NULL,"explore", "D:C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:C++
    ShellExecute(NULL,"print","C:Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:Test.txt
    ShellExecute不支持定向输出。

    CreateProcess

    原型如下:
    BOOL CreateProcess(
    LPCTSTR lpApplicationName, //执行程序名
    LPTSTR lpCommandLine, // 参数行
    //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
    LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
    BOOL bInheritHandles, // 继承标志
    DWORD dwCreationFlags, // 创建标志
    LPVOID lpEnvironment, // 环境变量
    LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
    LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
    LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
    );


    使用方法如下:
    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("D:putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);

    可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!


    关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:

    1、定义头文件
    在头文件stdafx.h中必须定义以下两个头文件:
    #include <shlobj.h> // 可替换为 windows.h
    #include <shellapi.h>
    如果定义了头文件 #include 的话就不必定义 #include 了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

    2、定义路径
    C++中所表示的路径要用 " "而不是平常所用的" ",所以以上三个函数表示路径都为:
    Disk:Directory...File name
    WinExec("D:Program FilesTestTest.exe",SW_SHOWMAXIMIZED);
    ShellExecute(NULL,"open","C:Test.txt",NULL,NULL,SW_SHOWNORMAL);
    bool fRet=CreateProcess("D:putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);

    本文所有程序在 Visual Studio.Net 2003 C++ 环境下编写,编译过程没有错误。
    测试环境:
    Windows XP Home Edition
    Visual Studio.Net 2003

  • 相关阅读:
    Libgdx 截屏功能
    Tomcat+Spring+Quartz Restart or shutdown error
    JSP 基础知识
    Git 常用命令备忘
    Java 基础知识点
    Android adb 命令的基础知识
    在 Cygwin 环境下使用 linux 命令(2)
    Libgdx Pixmap 的使用
    Android 平台开发一些基础知识
    Cygwin 安装列表
  • 原文地址:https://www.cnblogs.com/wb118115/p/2801396.html
Copyright © 2011-2022 走看看