help, 编程问题

pearhancn 2004-04-15 01:30:38
请问怎样在c程序中调用另外一个软件如word ?多谢了。
...全文
33 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
byf2002 2004-04-15
  • 打赏
  • 举报
回复
深入浅出ShellExecute
译者:徐景周(原作:Nishant S)

Q: 如何打开一个应用程序? ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或 ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );
正如您所看到的,我并没有传递程序的完整路径。
Q: 如何打开一个同系统程序相关连的文档? ShellExecute(this->m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );
Q: 如何打开一个网页? ShellExecute(this->m_hWnd,"open",
"http://www.google.com","","", SW_SHOW );
Q: 如何激活相关程序,发送EMAIL? ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );
Q: 如何用系统打印机打印文档? ShellExecute(this->m_hWnd,"print",
"c:\\abc.txt","","", SW_HIDE);
Q: 如何用系统查找功能来查找指定文件? ShellExecute(m_hWnd,"find","d:\\nish",
NULL,NULL,SW_SHOW);
Q: 如何启动一个程序,直到它运行结束? SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或: PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}

Q: 如何显示文件或文件夹的属性? SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\\"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);

byf2002 2004-04-15
  • 打赏
  • 举报
回复
样加载其他的应用程序?

三个SDK函数 winexec, shellexecute,createprocess可以使用。WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如泥用 SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
ShellExecute较 WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开 c:\temp\1.txt,而不用加载与 txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示Readme or Faq,我猜就是这么作的啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED)
CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:
STARTUPINFO stinfo
//启动窗口的信息
PROCESSINFO procinfo //进程的信息
CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,
NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo)
byf2002 2004-04-15
  • 打赏
  • 举报
回复
介绍一个功能强大的API函数 ShellExecute

编译 赵湘宁

问题的提出:
我使用MFC编写一个APP,要求About对话框中显示LOGO、公司名、地址和公司的URL链接。使用户点击URL链接以后,启动浏览器访问Web页面,这种对话框中的热链接使应用程序增色不少。我琢磨的方法是从系统注册表中通过查找.htm 或 .html文件的关联程序来获得缺省浏览器的名字,这样好象有很多工作要做。此外,如果浏览器已经打开,总是开始一个新的实例替代当前已有的一个实例。想找一个容易一点的方法,但我查过有关的资料,没有收获,请高手指教。
解决方法:
如果有这样的一个API函数该多好:OpenThisHereURLForMeNowPlease(),问题不就解决了!!我告诉你吧,有,但它不是你所想象的那个函数。到目前为止,有关文档中还没有提到过这么一个有用的函数,它能打开桌面上的任何文件,也能打开Internet URL。唯一我能找到的参考资料是在Microsoft® Access KnowledgeBase中很暧昧地提到过这个函数。
这个不可思议的函数就是:ShellExecute,取代了WinExec。你可以给它任何文件的名字,它都能识别出来并打开它。例如:

ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);


用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。

有关ShellExecute的详细用法信息自己去参考有关资料吧,重要的是你知道了这个函数能打开任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute 返回打开文件的应用的实例句柄。

更奇妙的是ShellExecute不仅能打开机器上的文件,还能打开Internet的站点地址。例如:

ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);
这个代码使你能访问微软的主页。当ShellExecute遇到文件名前面的“http:”时,可以判断出要打开的文件是Web文件,随之启动Internet Explorer 或者 Netscape Navigator 或者任何你使用的别的浏览器打开文件。ShellExecute还能识别其它协议,象FTP、GOPHER。甚至识别“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它启动电子邮件程序并打开一个待编辑的新邮件。总之,ShellExecute函数就是如此简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,它的用法参见有关文档。

现在,你知道了ShellExecute的秘密,用它很容易增加一个链接到你的About对话框。不是吗。:)

114sky 2004-04-15
  • 打赏
  • 举报
回复
用shellexecute API
114sky 2004-04-15
  • 打赏
  • 举报
回复
是启动另外一个程序吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧