一个ShellExecute的超全说明(www.phidels.com这个网站很多内容)
I. Introduction / Déclaration
ShellExecute fait partie des innombrables fonctions de l'API Windows ; cela veut dire qu'elle est utilisée par tous les programmes pour dialoguer avec le système d'exploitation.
|
ShellExecute est déclaré comme ceci :
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST;stdcall; |
Cela permet de comprendre directement les multiples fonctionnalités de cette fonction : elle peut exécuter un programme ou ouvrir un fichier (Filename), en lui passant des paramètres (Parameters), en spécifiant le mode d'affichage (ShowCmd).
Ensuite, il y a les types : HWND qui signifie que la fonction attend un Handle (identificateur unique d'un contrôle fenêtré) et PChar, ce type est peut être apparenté à une chaîne normale (String), à la différence qu'elle est reconnue, contrairement à String, par l'API Windows.
|
Au passage, il est maintenant déconseillé d'utiliser la fonction WinExec, car obsolète, elle est maintenue pour des raisons de compatibilité ascendante avec les versions 16 bits de Windows.
En conclusion, cette fonction est la plus adaptée, lorsqu'il s'agit d'ouvrir, d'exécuter un programme, même s'il s'agit ici qu'une partie de ses fonctionnalités...
![]() |
II. Exécuter un programme simple
C'est extrêmement simple, il suffit de spécifier le paramètre FileName, Operation, ShowCmd et accessoirement le paramètre Handle :
ShellExecute(Handle,'Open','C:\Windows\Calc.exe',nil,nil,SW_SHOWDEFAULT); |
Il faut comprendre que l'on demande d'ouvrir (paramètre "Open") la calculette de Windows (paramètre "C:\Windows\Calc.exe") et de l'afficher normalement, c'est à dire pas maximisée ou minimisée, mais comme si l'on ouvrait le fichier dans l'explorateur (paramètre SW_SHOWDEFAULT).
|
En conclusion, lancer un programme avec cette fonction est simple et rapide.
![]() |
III. Fichiers / Alias
Ce qui fait la puissance de ShellExecute par rapport à d'autre fonctions de l'API comme WinExec, c'est le support de l'ouverture de fichiers et des alias grâces aux variables d'environnement.
En effet, cette fonction peut non seulement exécuter des programmes ou des batchs DOS, mais aussi ouvrir des fichiers avec leur programme associé :
|
Ce code ouvrira le document spécifié dans l'OpenDialog, avec son programme associé. Par exemple, si le fichier est un .PAS, le code ouvrira Delphi avec le fichier ouvert ; si le fichier est un .TXT, le code ouvrira le Bloc-Note avec le fichier ouvert... Cela permet donc d'ouvrir n'importe quel fichier, sans se soucier quel programme il faut lancer, afin de l'ouvrir.
Ensuite, cette fonction gère, comme Démarrer \ Exécuter, les alias. En effet, si vous tapez "notepad" dans Exécuter, le Bloc-Note s'ouvrira, bien que Notepad.exe ne se situe pas dans la racine du disque. Il en est de même avec ShellExecute ; cela fonctionne grâce en partie aux variables d'environnement DOS, dans AutoExec ou Boot dans Win2K, il y a toujours une ligne du type :
|
Cela veut dire que Windows, s'il n'y a pas de chemin spécifié, devra chercher les exécutables dans ces dossiers. Partant de là, ces lignes sont correctes :
|
Dans ces appels, Windows va balayer les répertoires par Défaut, et lancer l'exécutable s'il est trouvé.
Enfin, ShellExecute gère les répertoires comme Exécuter, si l'on spécifie un répertoire, celui ci sera ouvert.
![]() |
IV. Opérations sur les fichiers
ShellExecute a pour l'instant été appelé avec comme paramètre Operation, la chaine "Open". Mais il en existe une infinité d'autres, bien que seulement quelques unes (dont "Open") sont indépendantes du sytème.
Operation permet ainsi de spécifier l'opération à réaliser sur le fichier spécifié par FileName, le plus souvent c'est "Open" qui est utilisé, mais il y en existe d'autres :
Open | Si le fichier est executable, il est executé. Sinon l'application associée est lancée |
Imprime le fichier | |
Find | Ouvre la boite de dialogue de recherche dans le dossier spécifié |
Edit | Ouvre le fichier avec l'éditeur associé |
Explore | Ouvre l'explorateur sur le dossier spécifié |
Properties | Ouvre la boite de dialogue des Propriétés du raccourci |
Cependant, toutes les opérations ne marchent pas sur tous les fichiers :
Open
|
Print
|
Find
|
Edit
|
Explore
|
Properties
|
|
Dossier | Ouvre le dossier | Aucun effet | Ouvre le boite de dialogue de recherche dans le dossier | Aucun effet | Ouvre l'explorateur dans le dossier | Aucun effet |
Exécutable | Lance l'exécutable | Aucun effet | Aucun effet | Aucun effet | Aucun effet | Aucun effet |
Fichier | Ouvre le fichier avec le programme associé | Imprime le fichier avec le programme associé | Aucun effet | Edite le fichier avec le programme associé | Aucun effet | Aucun effet |
Raccourci |
Lance la cible du raccourci | Aucun effet | Aucun effet | Aucun effet | Aucun effet | Ouvre la boite de dialogue "Propriétés du raccourci" |
Raccourci internet | Lance la cible du raccourci | Aucun effet | Aucun effet | Aucun effet | Aucun effet | Aucun effet |
Ressource internet | Lance la ressource internet | Aucun effet | Aucun effet | Aucun effet | Aucun effet | Aucun effet |
Pour précision, on pourrait se demander la différence entre Open et Edit, c'est vrai que dans la plupart des cas, il n'y en a pas, mais dans le cas des .HTM par exemple, Open ouvre le navigateur, alors que Edit ouvre l'éditeur HMTL. La différence n'est visible que lorsqu'un fichier est ouvert et édité par deux programmes différents (c'est le cas aussi des .BAT).
|
La spécialité du paramètre Operation est d'être une chaine, alors que la plupart des paramètres qui semblent limités de l'API sont des entiers. Or les différents paramètres de Operation sont illimités et extrémement variables d'une machine à une autre : on peut définir plusieurs constantes d'entiers pour une spécificité d'un OS, mais dans le cas d'Operation, chaque programme a le droit de d'ajouter ses paramètres, d'où la chaine qui est presque illimitée. Chaque programme peut rajouter ses paramètres, pour la simple et bonne raison que les différents paramètres sont stockés dans la base de registres, mais comme nom de clé, et pas comme valeur, d'où l'utilisation de chaine. Ces paramètres sont de surplus spécifiques à chaque extension, car stockés dans HKEY_CLASSES_ROOT\Extension\Shell\Operation ou HKEY_CLASSES_ROOT\CLSID\{CLSID_Objet}\Shell\Operation. Ces paramètres sont utilisés par ShellExecute, mais aussi, et surtout, par Explorer, pour créer le menu contextuel avec Ouvrir, Imprimer...
Il est donc possible d'ajouter sans trop de difficultés des nouvelles opérations, cela étant précisé en annexe.
Partant de là, on pourra créer une extension qui aura un nouveau paramètre Operation, et que l'on pourra appeller avec ShellExecute :
|
Ce code va donc compiler simplement le .DPR grâce au paramètre Operation.
![]() |
V. Mode d'affichage
Le dernier paramètre de ShellExecute permet tout simplement de spécifier comment sera la fenêtre de l'application ouverte, il y en a deux principaux et opposés :
SW_SHOW | Affiche la fenêtre normalement (pas minimisée, maximisée...) |
SW_HIDE | Cache la fenêtre |
Donc, ShellExecute permet de lancer une application complement cachée, sans être visible dans la barre de tâches :
|
Mais, il y a aussi d'autres paramètres, pour maximiser, minimiser :
SW_SHOWDEFAULT | Equivalent à SW_SHOW |
SW_MAXIMIZE | Affiche la fenêtre maximisée |
SW_MINIMIZE | Affiche la fenêtre minimisée et la sélectionne |
SW_SHOWMINNOACTIVE | Affiche la fenêtre minimisée et redonne le focus à le fenêtre active précedente |
SW_SHOWNA | Affiche la fenêtre comme SW_SHOW, mais ne l'active pas |
![]() |
VI. Passer des paramètres
ShellExecute peut evidemment passer des paramètres à un executable ou batch, il suffit de remplir le paramètre Parameters :
|
|
|
![]() |
VII. Dossier d'execution
Un programme s'execute toujours par rapport à un dossier, par défaut, c'est le dossier où il se trouve, mais ce dossier peut-être modifié. Ce dossier peut par exemple être modifié par un raccourci : grâce au champ "Démarrer dans : ". Le dossier d'execution sert à déterminer le chemin complet, lors de la spécification d'un seul nom de fichier sans chemin :
|
Dans cet exemple, Windows détermine le chemin complet de ce fichier par rapport au dossier d'execution, qui est le dossier où se situe le programme si aucun autre a été spécifié.
|
Bien qu'il y a peu de cas, où il faudra utiliser le dossier d'execution, il est facile de l'utiliser avec ShellExecute, il suffit de le spécifier :
|
Ce qui a pour équivalent dans un raccourci à :
|
Et en DOS, à :
|
![]() |
VIII. Résultat d'exécution
ShellExecute est une fonction, qui renvoit le résultat : si le résultat renvoyé est plus petit ou égal à 32, une erreur s'est produite, et l'opération ne sera pas executée.
|
Les principaux différents codes d'erreur sont les suivants :
0 | Plus de mémoire disponible |
ERROR_FILE_NOT_FOUND | Le fichier est introuvable |
ERROR_PATH_NOT_FOUND | Le dossier est introuvable |
ERROR_BAD_FORMAT | Le fichier n'est pas un executable correct (pas une application Win32 valide) |
SE_ERR_ACCESSDENIED | Acces refusé |
SE_ERR_OOM | Plus assez de mémoire pour finir l'opération |
SE_ERR_SHARE | Violation de partage |
SE_ERR_NOASSOC | Le fichier spécifié n'a pas d'executable associé |
L'executable associé ne peux pas imprimer le fichier spécifié |
Il existe encore d'autres codes d'erreur, comme ceux associés avec les liaisons DDE (Dynamic Data Exchange).
|
![]() |
IX. Limites de ShellExecute
Bien que ShellExecute soit une fonction puissante, elle a aussi ses limites, elle ne doit pas être utilisée dans ces cas :
![]() |
|
![]() |
|
![]() |
|
![]() |
![]() |
Annexe I. Ajout d'une opération
On peut facilement ajouter une opération à une extension de fichier :
Par exemple, lorsque l'on a un éditeur d'image simple et que l'on ouvre un gif animé, celui-ci ne l'anime pas. Il faudrait l'ouvrir avec le navigateur. C'est pourquoi, on va ajouter une opération "Anime" dans l'extension Gif afin de pouvoir ouvrir un gif animé.
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
Maintenant, vous pouvez écrire :
|
Ce code va donc ouvrir le navigateur par défaut, et animer le Gif.
On peut donc aussi ajouter facilement une opération "Compile" aux projets Delphi (.DPR).
![]() |
Annexe II. Téléchargements
![]() |
|
![]() |
|
![]() |
http://www.phidels.com/php/index.php3?page=../php/tutoriaux/shellexecute/shellexecute.htm&id=423
一个ShellExecute的超全说明(www.phidels.com这个网站很多内容)的更多相关文章
- 【转】一个 Vim 重度用户总结的 vim 超全指南
[转]一个 Vim 重度用户总结的 vim 超全指南 我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 ...
- 超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...
- 超全的web开发工具和资源
首页 新闻 产品 地图 动态 城市 帮助 论坛 关于 登录 注册 · 不忘初心,继续前进,环境云V2接口正式上线 · 环境云测点地图全新改版 · 祝福各位环境云用户中秋快乐! 平台信息 培训互动 ...
- 【转】iOS超全开源框架、项目和学习资料汇总
iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...
- 超全超详细的HTTP状态码大全(推荐抓包工具HTTP Analyzer V6.5.3)
超全超详细的HTTP状态码大全 本部分余下的内容会详细地介绍 HTTP 1.1中的状态码.这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. ...
- iOS超全开源框架、项目和学习资料汇总--数据库、缓存处理、图像浏览、摄像照相视频音频篇
iOS超全开源框架.项目和学习资料汇总--数据库.缓存处理.图像浏览.摄像照相视频音频篇 感谢:Ming_en_long 的分享 大神超赞的集合,http://www.jianshu.com/p/f3 ...
- 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17
黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...
- 转帖: 一份超全超详细的 ADB 用法大全
增加一句 连接 网易mumu模拟器的方法 adb connect 127.0.0.1:7555 一份超全超详细的 ADB 用法大全 2016年08月28日 10:49:41 阅读数:35890 原文 ...
- 超全PHP学习资源整理:入门到进阶系列
PHP是少数几门在语言层面饱受诟病,但在实际开发和应用上却又让人无法撒手的语言之一.就好比路边摊小吃,一遍骂人家不卫生,一遍却又说:真香.所谓接地气,不外如此,大道理不说,PHP光是轮子多.市场占有率 ...
随机推荐
- 向前辈致敬 strspn
把8位的CHAR型数据分解为:前5位和后3位,这样2^5 = 32个CHAR型数+值就可表示所有的CHAR型数据 这样做的好处:在给出子串后,不用比较256次,最多比较32次即可判断出是否一个数在子串 ...
- PDFium-PDF开源之旅(1)-初探代码下载编译
近日,Google和Foxit合作开源了Foxit的PDF源代码. 叫PDFium 相关新闻不少.哈,虽说已经不是程序猿了.只是还是有兴趣跑起来围观看看.废话少说.先说编译代码的步骤(事实上Googl ...
- KeCode对照表(键盘按键的获取)
KeyCode键盘对照表: http://www.cnblogs.com/furenjian/articles/2957770.html
- HDU2546:饭卡(01背包)
HDU2546:饭卡 http://acm.hdu.edu.cn/showproblem.php?pid=2546 当我们遇到问题选择物体的价值和顺序相关时就需要,排完序后对其01处理.这题因为当我们 ...
- Apache与Nginx网络模型
Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的.下面通过比较Apache和Nginx工作原理来比较. 传统Apache都是多进 ...
- IE 弹出框处理经验
//各屏幕弹出窗样式 // 1366*768var style_1366x768 = "dialogWidth:950px;dialogHeight:650px;help:no;center ...
- bzoj 1857: [Scoi2010]传送带 三分
题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 934 Solved: 501[Submit][Stat ...
- A Byte of Python 笔记(2)基本概念:数、字符串、转义符、变量、标识符命名、数据类型、对象
第4章 基本概念 字面意义上的常量 如5.1.23.9.23e-3,或者 'This is a string'."It's a string!" 字符串等 常量,不能改变它的值 数 ...
- uncompyle2 windows安装和使用方法
uncompyle2是Python 2.7的反编译工具,它可以把python生成的pyo.pyc字节码文件反编译为十分完美的源码,并可以将反编译后的源码再次生成字节码文件! ----- 本文介绍在wi ...
- python的map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于list [1, 2 ...