♂〓 从蚂蚁到蝴蝶 〓♂

能来到我这个无人问津的小破屋转转,只有两种可能——
1、我某篇文章的某几个字恰巧被你从茫茫博海中搜到;
2、你实在是闲极无聊且耐心之至浏览了所有博客内容。
无论怎样,既然来了,就留个脚印吧!

白驹过隙
乱弹分类
· 所有网志
· 我的流水账
· 蚂蚁私房菜
· 生活的思考
· 春节火车票
· VC技术学习
· 最近比较烦
搜索本站
别处遛遛
· 管理我的博客
· 管理我的博客
· 静微BB的小窝
· Steve的移民历程
· 雷大头之家
· 水木周平的BLOG
· 徐小平的BLOG
· 测试相关

订阅 RSS

0008025

歪酷博客


« 上一篇: 初学VC之路:第一个任务,编写对话框(1) 下一篇: 初学VC之路:第一个任务,编写对话框(3)——实现具有位图背景的对话框 »
新蚂蚁蝴蝶派 @ 2006-04-14 14:56

       接下来的一个星期都在“找代码——抄代码——运行失败”,再“找代码——抄代码——运行失败”的恶性循环中度过,除了第一天搭好了对话框和按钮的框架以外,每天就只有小小的一点进展: 
        第一天查找各种加载图片的办法,把简单的不超过10行的代码都尝试了一遍,失败;
        第二天专攻对话框图片的加载方法,可是实在不懂代码里面加载类变量,定义成员变量,还有调用的函数参数都是什么意思,怎么调用,只好放弃;
        第三天感觉自己就像个没头苍蝇乱转,无奈向指导人JJ求救。JJ说让我先实现基本的按钮调用程序功能,之后再考虑怎么加载图片。上网搜索了一下,发现这个还比较容易,有三种SDK函数可以调用,分别是:
     WinExec, ShellExecute,CreateProcess
        其中以WinExec最为简单,ShellExecuteWinExec灵活一些,CreateProcess最为复杂。
    WinExec 两个参数,前一个指定路径,后一个指定显示方式。
    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
    CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,就需要使用CreateProcess函数了。
        具体用法如下:
WinExec

    这个函数最简单,只有两个参数,原型如下: 
      UINT WinExec(
      LPCSTR lpCmdLine,   // 命令路径
      UINT uCmdShow      // 显示方式,共有11种,具体可以查阅MSDN的ShowWindow函数
      );

    使用方法如下:
     WinExec("Notepad.exe", SW_SHOW);  // 打开记事本
     WinExec("D:\Program Files\Test\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe(注意文件名的大小写也必须完全一样)
        需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如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);

        由此,我就设计了三个按钮,分别用这三种函数调用了三个应用程序,设置在每个按钮的ONCLICK消息中:
        WinExec("taskmgr",SW_NORMAL); //调用系统任务管理器
        ShellExecute(NULL,"open","C:\ReadMe.txt","","",SW_SHOW); //打开C盘下的ReadMe文件
        STARTUPINFO si={sizeof(si)};
        PROCESS_INFORMATION pi;
        CreateProcess(NULL,"cleanmgr",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); //调用系统的清理磁盘程序
 

        编译运行后都通过了,我的对话框终于有了一点用处,可以通过单击按钮执行一些应用程序了。
        从网上看到有人说,使用这三个函数也有一些注意事项:

        1、定义头文件

        在头文件stdafx.h中必须定义以下两个头文件:
       #include <shlobj.h> // 可替换为 windows.h
       #include <shellapi.h>
        如果定义了头文件 #include <windows.h>的话就不必定义 #include <shlobj.h>,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。 
      2定义路径
    C++中所表示的路径要用 " \ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:
Disk:\Directory\...\File name
        但是我的stdafx.h中并没有添加上述两个头文件,目录路径也还是用"\"表示,也一样运行通过了,不知道是什么原因。我用的编译环境是VC++6.0,Win2K,人家用的是Viusal Studio .Net和Windows XP Home Edition,难道这个也是原因之一? 

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=445876





评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定