今天测试了几个在程序调用其它应用程序的函数
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
基本操作代码:













