Windows环境下调用其他Application的方法

本文介绍了在Windows环境下,如何使用system、CreateProcess和ShellExecute等函数调用其他应用程序。system函数存在不支持中文和显示DOS框的问题,而WinExec和ShellExecute则能避免这些问题。CreateProcess是最强大的调用方式,支持Unicode编码,并允许对子进程进行精细控制。通过示例代码,展示了如何使用这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天测试了几个在程序调用其它应用程序的函数

system(const char*_Command)

HINSTANCE ShellExecute(      
    HWND hwnd,     LPCTSTR lpOperation,     LPCTSTR lpFile,     LPCTSTR lpParameters,     LPCTSTR lpDirectory,     INT nShowCmd );
UINT WinExec(
  LPCSTR lpCmdLine,
  UINT uCmdShow
);

 以及BOOL  CreateProcess(  
   LPCTSTR  lpApplicationName,                                  
   LPTSTR  lpCommandLine,                                            
   LPSECURITY_ATTRIBUTES  lpProcessAttributes,  
   LPSECURITY_ATTRIBUTES  lpThreadAttributes,    
   BOOL  bInheritHandles,                                            
   DWORD  dwCreationFlags,                                        
   LPVOID  lpEnvironment,                                           
   LPCTSTR  lpCurrentDirectory,                                
   LPSTARTUPINFO  lpStartupInfo,                             
   LPPROCESS_INFORMATION  lpProcessInformation  
);  
system函数MS不能支持中文,这个应该是Shell命令的特点,在不支持中文的DOS下应该就是不能支持中文,而且有一个问题,就是会出现一个DOS框,一直在程序执行过程中

WinExec不会出现Dos框,但是因为WinExec的第一个参数要求是LPCSTR,一个8位的ANSI字符串指针,所以如果使用Char* 是不会有什么问题的,但是在MFC下面使用CString,特别是是Unicode编码的情况下就一定要先转换,我采用的转化方法是使用

WideCharToMultiByte(CP_ACP,

WC_COMPOSITECHECK,

m_path.GetBuffer(),//wchat_t *

-1,//以0X00结尾

path,//目标字符串

1024,

NULL,NULL);//自己参看MSDN

然后再使用WinExec

在ShellExecute不会有这么麻烦,它直接支持LPCTSTR字符串,默认的就是Unicode编码格式,很方便,同样也不会有Dos框出现

最后CreateProcess(...),这个函数,哈哈,真是功能强大

基本用法CreateProcess(NULL,m_path.GetBuffer(),NULL,NULL,false,0,NULL,NULL,&si,&pi)

//其中si是STARTUPINFO,pi是PROCESS_INFORMATION类型的2个变量,因为他们的存在所以操作被调用的程序变得很容易

同样使用的是LPWSTR,可以直接使用CString::GetBuffer(),也是Unicode编码格式

当CreateProcess成功调用后,pi

typedef struct _PROCESS_INFORMATION {
HANDLE hProcess

HANDLE
hThread;
DWORD
dwProcessId;
DWORD
dwThreadId; } PROCESS_INFORMATION;

里面就记录下了该程序的运行状态,我们可以使用诸如TerminateProcess等等的函数来使用这些参数,还可以使用WaitForSingleObject来阻塞父进程,一直到子进程退出

最后如果不进行任何操作可以使用CloseHandle来释放pi中的HANDLE

基本操作代码:

 

ShellExecute(NULL,_T("open"),(LPCTSTR)m_path.GetBuffer(),NULL,NULL,SW_SHOW);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_path.GetBuffer(),
-1,path,1024,NULL,NULL);
LPCSTR s
=(LPCSTR)path;
int i=WinExec(s,SW_SHOW);
system(path);
if(CreateProcess(NULL,m_path.GetBuffer(),NULL,NULL,false,0,NULL,NULL,&si,&pi))        
{
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}

UINT res
=0;
TerminateProcess(pi.hProcess,res);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值