得,今天又折腾个小东西,顺手记一下过程。主要是关于怎么用代码打开外部文件或者程序的事儿,捣鼓到shellexecute
这个东西,发现还挺有意思,特别是它那个头文件的事儿。
是这么个情况,我最近在写一个处理数据的小工具,处理完会生成一个结果文件,比如说是个文本文件或者表格啥的。每次运行完,我都得手动去文件夹里找到那个文件再打开看,有点烦。我就琢磨着,能不能让程序自己处理完之后,直接帮我把那个结果文件打开?
一开始没啥头绪,就想着是不是得用啥特别复杂的方法,调用系统底层的一些接口啥的。隐约记得好像有叫CreateProcess
之类的东西,但感觉那玩意儿参数贼多,看着就头大,估计得研究半天。我这人比较懒,就想找个简单点的法子。
后来就在网上瞎搜,看看别人是怎么搞的。搜着搜着,就看到ShellExecute
这个函数。介绍说这是Windows提供的一个API,用起来相对简单,可以直接打开文件、网址(虽然我这回没用上打开网址)、运行其他程序等等。听起来好像正是我想要的。
然后我就试着在我代码里直接写 `ShellExecute(...)` ,心想这不就完事?结果编译器直接给我报错,说不认识这个ShellExecute
是个啥玩意儿。这时候我才反应过来,这东西八成不是C++标准库自带的,是Windows系统层面的东西,得告诉编译器去哪儿找它的定义。
这下问题就变成:`ShellExecute`它爹是谁?也就是它定义在哪个头文件里? 继续搜呗。果然,很快就找到答案。网上都说,要用ShellExecute
,你得在代码文件开头加上一句 `#include 。,原来是藏在这个Shellapi.h
里面!这名字看着也挺像那么回事儿,“Shell API”嘛跟外壳操作相关。
知道这个关键点,就好办。我回到我的代码里,老老实实地在顶部加上#include 。再重新编译,果然不报错!
接下来就是调用函数本身。ShellExecute
有好几个参数,我大概看下,常用的就是:
- 第一个参数是父窗口句柄,我暂时用不上,直接填个
NULL
。 - 第二个参数是操作类型,比如
"open"
就是打开,"print"
就是打印。我就用"open"
。 - 第三个参数就是要操作的文件名或者程序路径,这个最关键,我就把我那个生成的结果文件的完整路径填进去。
- 后面还有几个参数,比如传给程序的参数、默认目录啥的,我暂时也用不上,就填
NULL
。 - 一个参数是窗口显示方式,一般用
SW_SHOWNORMAL
就行,就是正常打开。
我照着这个格式写一行代码,类似这样:ShellExecute(NULL, "open", "C:\\我的结果\\结果报告.txt", NULL, NULL, SW_SHOWNORMAL);
(当然路径是我瞎编的)。
然后运行我的小程序,等数据处理完。奇迹发生! 程序跑完的一瞬间,系统自动用默认的文本编辑器(比如记事本)打开我指定的那个“结果报告.txt”文件。目的达成,省事儿多!
这回实践的结论就是:
想在Windows程序里简单地打开个文件、跑个外部程序啥的,ShellExecute
确实是个挺方便的选择,比那个复杂的CreateProcess
友好多。而用它的关键,就是别忘在代码开头把 `Shellapi.h` 这个头文件给包含进来。不然,编译器不认识它,你后面写啥都白搭。
好,今天就这点心得,记录完毕。希望能帮到同样遇到这个问题的朋友。