zoukankan      html  css  js  c++  java
  • windows下调用外部exe程序 SHELLEXECUTEINFO

    本文主要介绍两种在windows下调用外部exe程序的方法:

    1、使用SHELLEXECUTEINFO 和 ShellExecuteEx

    SHELLEXECUTEINFO 结构体的定义如下:

     1 typedef struct _SHELLEXECUTEINFO {
     2   DWORD     cbSize;
     3   ULONG     fMask;
     4   HWND      hwnd;
     5   LPCTSTR   lpVerb;
     6   LPCTSTR   lpFile;
     7   LPCTSTR   lpParameters;
     8   LPCTSTR   lpDirectory;
     9   int       nShow;
    10   HINSTANCE hInstApp;
    11   LPVOID    lpIDList;
    12   LPCTSTR   lpClass;
    13   HKEY      hkeyClass;
    14   DWORD     dwHotKey;
    15   union {
    16     HANDLE hIcon;
    17     HANDLE hMonitor;
    18   } DUMMYUNIONNAME;
    19   HANDLE    hProcess;
    20 } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

    参数详解:

    cbSize

    结构大小,以字节为单位。

    fMask

    一个标志数组,用来设置其他成员的有效性。

    hwnd

    可选。执行ShellExecuteEx的窗口句柄,可设为NULL。

    lpVerb

    指定执行的动作,包括:edit ,explore ,find ,open,print, properties

    lpFile

    以 结尾的字符串,指出 lpVerb 的操作对象的路径,被系统支持的操作包括文本的 open 、 print等

    lpParameters

    可选。运行/打开程序的参数,如果打开的是一个文档,则该项无效

    lpDirectory

    可选。指明工作目录的名字,成员没有说明,则默认为当前目录

    nShow

    必须。指定打开的程序的显示方式,为SW_值中的一个。

    hInstApp

    【out】如果设置SEE_MASK_NOCLOSEPROCESS S值并且ShellExecuteEx 调用成功,则该项的值大于32,如果调用失败,则将设置为 SE_ERR_XXX 的错误值。

    lpIDList

    一个ITEMIDLIST结构的地址,用来存储成员的特别标识符,当fMask不包括SEE_MASK_IDLISTSEE_MASK_INVOKEIDLIST时该项被忽略

    lpClass

    用以指明文件类别的名字或GUID,当fMask不包括SEE_MASK_CLASSNAME时该项被忽略

    hkeyClass

    获得已在系统注册的文件类型的Handle,当fMask不包括SEE_MASK_HOTKEY时该项被忽略

     dwHotKey

    程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),修改标志为(modifier flags)的详细列表请看WM_SETHOTKEY消息的描述,当fmask不包括SEE_MASK_HOTKEY时该项被忽略

    DUMMYUNIONNAME

    hIcon

    取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略

    hMonitor

    将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略

    hProcess

    指向新启动的程序的句柄。若fMask不设为SEE_MASK_NOCLOSEPROCESS则该项值为NULL。但若程序没有启动,即使fMask设为SEE_MASK_NOCLOSEPROCESS,该值也仍为NULL。

    ShellExecuteEx

    功能:Performs an operation on a specified file。对指定应用程序执行某个操作

    原型:
    BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);

    参数:

    lpExecInfo

    [in, out] 一个指向 SHELLEXECUTEINFO 结构的指针,用来传递和保存应用程序执行相关的信息。

    返回值:

    如果函数成功执行就返回TRUE,否则返回 FALSE 。可调用 GetLastError 获取错误信息。

    备注:

    由于ShellExecuteEx 能够将执行委托给那些由组件对象模型COM激活的Shell 扩展(数据源,上下文菜单句柄,动词实现),因此在调用ShellExecuteEx 之前要先初始化 COM。某些Shell 扩展要求单线程单元模型的COM,在这种情况下,应当像下面一般初始化COM:

    CoInitializeEx (NULL,COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

    在某些情况下 ShellExecuteEx 并没有使用这种类型的Shell 扩展,这时就无需初始化COM。虽然如此,总是在使用这个函数之前初始化COM是个不错的举措。

    使用实例:

     1 SHELLEXECUTEINFO shellInfo;
     2      memset(&shellInfo,0,sizeof(shellInfo));
     3  
     4      shellInfo.cbSize = sizeof(shellInfo);
     5      shellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
     6      shellInfo.hwnd = NULL;
     7      shellInfo.lpFile = (LPCSTR)(kduPath.c_str());
     8     shellInfo.lpVerb = ("open");
     9     shellInfo.nShow = SW_HIDE;
    10  
    11      CPLString kduParameters = CPLSPrintf("-i %s -o %s",name.c_str(),pgmname.c_str());
    12      shellInfo.lpParameters = (LPCSTR)(kduParameters.c_str());
    13  
    14      bool isOver = ShellExecuteEx(&shellInfo);
    15      WaitForSingleObject(shellInfo.hProcess,INFINITE);

    2、使用C++ System函数

    函数原型:

    int system (const char* command);

    HelloXX是一个exe程序,代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main(int argc,char *argv[])
     5 {
     6     if(argc!=2){
     7         cout<<"you should use two arguments"<<endl;
     8         return -1;
     9     }
    10 
    11     cout<<"Hello : "<<argv[1]<<"
    "<<endl;
    12     return 0;    
    13 }


    编译成功后,放在某个文件夹下,例如E:\C++\HelloXX.exe

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char s[100];
     7     sprintf_s(s,"%s %s %s","E:\C++\HelloXX.exe","WangGang");    
     8     system(s);    
     9     return 0;
    10 }


    
    
     需要注意,路径名不要包含空格。
     
  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3699306.html
Copyright © 2011-2022 走看看