VC中调用其它程序的三种方法总结

来源:互联网 发布:大数据分析 职业规划 编辑:程序博客网 时间:2024/05/18 00:31
WinExec 两个参数,前一个指定路径,后一个指定显示方式。
      UINT WinExec(          
            LPCSTR lpCmdLine,   // 命令路径  
            UINT uCmdShow         // 显示方式  
      )
 
WinExec("Notepad.exe", SW_SHOW);  // 打开记事本
WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
 
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。可以直接在执行命令后面带参数。
 
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
调用该函数需#include <shellapi.h>
 
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); //用默认浏览器打开链接;
ShellExecute(NULL,NULL,"IEXPLORE.EXE","http://www.google.com" , NULL, SW_SHOWDEFAULT ); //用指定浏览器打开链接;     
 
CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用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 = {sizeof(si)};    
BOOL ret = CreateProcess(pszExeFile, (LPTSTR)pszCmdLine, NULL, NULL, FALSE, HIGH_PRIORITY_CLASS, NULL, NULL, &si, &pi);
if(ret)
{    
// 关闭子进程的主线程句柄    
CloseHandle(pi.hThread);    
// 关闭子进程句柄    
 CloseHandle(pi.hProcess);}
 
如果有参数,则使pszExeFile=NULL,pszCmdLine="Cmd.exe param..."
 
注:
如果CreateProcess()函数调用成功,则调用CloseHandle()函数关闭所返回的子进程的句柄和子进程主线程的句柄。为什么要这样做呢?   
在创建一个新进程时,系统会为该进程建立一个进程内核对象和一个线程内核对象,而每个内核对象都有一个使用计数,系统会为这两个对象赋予初始的使用计数:1,在Createprocess()函数返回之前,它将打开创建的进程对象和线程对象,并将每个对象与进程和线程相关的句柄放在其最后一个参数PROCESS_INFORMATION结构体的相应成员中。当CreatePoress()函数在其内部打开这些对象时,每个对象的使用计数就变为2,如果在父进程中不需要使用子进程的这两个句柄,则可以调用CloseHandle()函数关闭他们,系统将子进程的进程内核对象和线程内核对象的计数减1,当子进程终止运行时,系统会将这些使用计数减1,这时子进程的进程内核对象和线程对象计数就变为0了,这来两个内核对象就能够释放了。
所以在编程时,当不需要操作这些内核对象时,总是应该调用CloseHandle函数关闭它们。