- 浏览: 16113 次
最新评论
VC 打开外部文件
- 博客分类:
- 技术杂绘
VC 打开外部文件
2010年07月30日
目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了《vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess》,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题)。
三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
WinExec 两个参数,前一个指定路径,后一个指定显示方式。
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:
(一)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 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。
这个函数只能打开exe文件。
需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms687 393[/url](VS.85).aspx
(二)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不支持定向输出。
这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
需要的头文件:windows.h,shellapi.h(前者是我试验出来的,后者是msdn说需要的)。另外这两者的先后顺序不能变。
msdn上说明:[url]http://msdn.microsoft.com/en-us/library/bb762 153[/url](VS.85).aspx
(三)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);
这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms682 425[/url](VS.85).aspx
可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!
关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:
1、定义头文件
原作者的内容删去。
这个是引用新函数都必须注意的内容。但是MS的头文件引用顺序有点怪,比如上面的三种清理。另外,如果用了预编译,那么记得在任何源程序中的#include "stdafx.h"之前的引用都会失效,从其后才生效。(不可否认,预编译有他的好处,尤其当程序很大的时候,但是任何好处都是要付出代价的)
2、定义路径
C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:
Disk:\\Directory\\...\\File name
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL, SW_SHOWNORMAL);
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE ,NULL,NULL,NULL,NULL,&si,&pi)
3、注意文件的路径
在程序a调用程序b的时候,b原来的默认的当前路径都会变成a的当前路径。所以,一定要注意。
可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。
VC++6.0
Win95
如何在VC++中调用外部的DOS程序?它的函数是什么?如果用API,它的函数是什么?
回答:
你可以使用Windows API函数WinExec、ShellExecute。这两个函数可以调用Windows和DOS程序。WinExec主要运行EXE文件。如:
WinExec("Notepad.exe Readme.txt", SW_SHOW);
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。如:
ShellExecute(0, "open", "http://askpro.yeah.net", NULL, NULL, 0);
另外,参考QA000583 "外调一个DOS程序,但是又不想显示其产生的窗口"。
Vc 5.0
Windows 95
我正在编写一个程序,想外调一个现成的Com,但是又不想显示其产生的窗口,我试过可以关闭该窗口,一样能运行,可是在我的程序中如何获取该窗口句柄,如何自动关闭它?(飞飞)
其实使用ShellExecute调用DOS程序时可以不显示窗口,如:
ShellExecute(0, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE);
对于你的问题,你可以使用FindWindow获得句柄,但关掉窗口就不能再继续执行了。而你说的关闭窗口还能执行,大概是因为在你关闭窗口时已经运行结束了。
#include "stdafx.h"
#include
#include //ShellExecute 要引用的库
int main(int argc, _TCHAR* argv[])
{
ShellExecute(NULL,NULL,_T("E:\\Projekt1.exe"),NULL ,NULL,SW_SHOW);
getchar();
return 0;
}
#include "stdafx.h"
#include
#include
#include
DWORD WINAPI ThreadWork(LPVOID num)
{
printf("%d\n",num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadID[5];
HANDLE threadhandle=CreateThread(NULL,
0,
ThreadWork,
(LPVOID)2,//传递的参数
0,
&dwThreadID[0]);
getchar();
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiangxinyu/archive/2010/03/18 /5393037.aspx
发表评论
-
多线程加速图像模板匹配
2012-01-20 02:07 1914多线程加速图像模板匹 ... -
Windows消息机制VC
2012-01-20 02:07 678Windows消息机制VC 2011年0 ... -
使用 C++ 和 MFC 进行多线程编程
2012-01-20 02:07 2238使用 C++ 和 MFC 进行多线程编程 2010年11月0 ... -
windows程序设计相关思想
2012-01-20 02:07 666windows程序设计相关思想 ... -
DLL劫持原理------转载自百度
2012-01-19 09:57 974DLL劫持原理------转载自百度 2011年07月29日 ... -
2011-4-22
2012-01-19 09:57 5292011-4-22 2011年04月22日 Window ... -
system32文件夹里的文件详解
2012-01-19 09:57 763system32文件夹里的文件详解 2011年05月23日 ... -
七月的天书II――Dos物语
2012-01-19 09:57 621七月的天书II――Dos物 ... -
windows
2012-01-19 09:57 1399windows 2011年04月06日 ... -
java进程使用的最大内存的数值
2012-01-17 02:28 1044java进程使用的最大内存 ... -
vista 系统问题
2012-01-17 02:28 465vista 系统问题 2010年06月04日 Vista ... -
电脑端酷炫体验安卓4.0冰淇淋三明治,期待早日与小米合体
2012-01-17 02:27 796电脑端酷炫体验安卓4.0 ... -
.net控件缩写列表
2012-01-15 22:13 578.net控件缩写列表 2010年05月24日 最近使 ... -
WPF事件
2012-01-15 22:13 462WPF事件 2010年07月14日 事件描述Annota ... -
C#里边的控件缩写大全(比较规范)
2012-01-15 22:13 839C#里边的控件缩写大全(比较规范) 2010年11月09日 ... -
2011-6-19
2012-01-15 22:13 5492011-6-19 2011年06月19日 ... -
50多个强大的jQuery插件应用实例
2012-01-15 22:13 42650多个强大的jQuery插件应用实例 2009年12月14 ...
相关推荐
VC打开CAD(DWG)文件实例 含DDVue.ocx
2. 打开def文件修改之 i) 添加 LIBRARY mydll.dll EXPORTS ii) 在EXPORTS后面加入改好的需要导出到lib中函数名列表 (注意: 因为函数调用约定的不同,所以导出的函数名会有前缀或后缀,这些都尽量不要修改。否则...
执行外部exe获取返回值
比如在记事本或DW中,若有外部程序打开了某个文件,并进行了内容编辑及保存,若你当前正在打开本文件,则程序会弹出一个提示,告诉你文件被外部程序修改,是否恢复文件?或许平时你见的比较多吧?实现的方法是:利用...
07_PreviewFileDlg_Demo 为打开文件对话框增加预览功能。 08_InputDlg_Demo 从内存创建对话框。 第6章(\ Chapter06) 示例描述:本章介绍Windows应用程序消息循环的原理和消息处理技巧。 01_PeekMsgDemo 传递...
// 关闭外部打开的word应用程序 BOOL NewDoc(CString tpName); // 根据模板创建文档 void SaveDoc(CString Filename); // 保存文档到文件路径 void TypeText(CString Text); // 在当前位置...
2、解决以EXE文件存放在网上而直接在网页上打开会在排除第2步退出的问题。 1.7.2.3_x64更新:2009-11-26 1、解决所有V4版本的写入ID弹出用户名密码的问题。 1.7.2.4_x64更新:2009-11-30 1、修正部分用户在自动...
fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指...
静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和...
手把手教你的精彩 配套博文地址:https://blog.csdn.net/maoyeahcom/article/details/108583124
VC2003中的7.1 版本打开, 1. 在一个excel文件中,读取不同sheet需要多次打开该文件(DataBase)(多次后就可能需要几秒钟) ----修改了 2. DeleteSheet存在问题, 改为EmptySheet, 但需要外部调用commit,可以和修改表...
2,准备glib:glib需要dirent的支持,否则在编译时会提示无法解析外部符号的错误。解决方法为: 将根目录\build\win32\dirent目录下的二个C文件和一个H文件拷贝到根目录\glib目录下。 3,修改根目录\glib目录下的...
2.通常一个VC项目中包含多个C或C++文件,有时需要同时对这一系列的文件进行lint检查,我们可以通过配置一个pclint_project来达到目的。 和前面第一步中的方法基本一样,不过这里我们需要用到unix中的find等命令来...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
9、修正添加的打开方式没有增加到“用外部程序打开”下子菜单的 bug; 10、改善“配置外部程序”的功能; 11、修正运行新窗口时弹出文件未找到的错误提示; 12、其它一些细节修改; 13、修正“复制为 UBB 代码”后...
其中使用了easyx图形库,easyx的外部文件需自己另外下载并配置好,本资源未包括该扩展库的文件,即把几个文件放进VC6.0的Lib文件夹里就好了) 作品名称:魔方还原 作品功能:进行三阶魔方还原。 界面介绍:打开...
)VC-Volkov Commander 4.99.08,DOS下支持中文长文件名的文件管理器,具有图形化的界面,支持鼠标操作,执行文件:vc.com。 此压缩包下载后解压缩到硬盘上,在nero中把它们加入到待刻录的内容中(如下图) 待...
tesserocr.cpp(596): fatal error C1083: 无法打开包括文件: “ leptonica/allheaders.h ”: No such file or directory error: command 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl...
串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行...但在Win32中,串口和其他通信设备均被作为文件处理,串口的打开、关闭和读写等操作所用的API函数与操作文件的函数相同。可通过CreateFile()函数打
如果检测到外部程序打开Chrome,则自动追加配置文件中的参数到Chrome命令行。所谓外部程序打开,也就是指不是由Chrome自己启动新进程,例如双击运行(Explorer.exe),点击QQ面板上的邮箱(QQ.exe)。 其它说明: •...