64,637
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<windows.h>
using namespace std;
bool WinExec(LPCTSTR Filename)
{
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo,sizeof(processInfo));
if(!CreateProcess(Filename,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE, NULL,NULL,NULL,&processInfo))
{
return false;
}
CloseHandle(processInfo.hThread);
CloseHandle(processInfo.hProcess);
return true;
}
int main()
{
WinExec("calc.exe");
return 0;
}
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si; //Specifies the window station,
//desktop, standard handles, and appearance of
//the main window for a process at creation time.
PROCESS_INFORMATION pi; //进程信息,原始结构体如下:
/*
typedef struct _PROCESS_INFORMATION
{ HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
*/
//Fills a block of memory with zeros. 初始化内存块,全部填充值
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc != 2 ) //控制台读入两个字符串,一个是本程序的名字,另一个是要建立子的进程
{
printf("用法: %s [cmdline]\n", argv[0]); //提示用户如何传入参数
printf("运行方式不正确!系统退出..\n"); //用于测试
system("pause"); //用于测试
return;
}
// 创建子进程
if( !CreateProcess( NULL, // No module name (use command line)
argv[1], // Command line //TEXT("D:\\MyDocuments\\Visual Studio 2005\\project\\Stack_TCC\\debug\\Stack_TCC.exe"),
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf("创建进程失败(%d)\n", GetLastError() );
//printf("创建进程失败..");
system("pause"); //用于测试
return;
}
//打印进程信息
printf("一下是子进程的信息:\n");
printf("进程ID pi.dwProcessID: %d \n",pi.dwProcessId);
printf("线程ID pi.dwThreadId: %d \n",pi.dwThreadId);
//printf("句柄进程pi.hProcess: %s \n",pi.hProcess);
//printf("句柄线程pi.hThread: %s \n",pi.hThread);
// 等待知道子进程退出...
WaitForSingleObject( pi.hProcess, INFINITE );
//WaitForSingleObject()函数检查对象的状态,如果是未确定的则等待至超时
/*
//WaitForSingleObject()函数原型:
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds //超时时限 INFINITE 为无穷
);
*/
//子进程退出
printf("子进程已经退出... \n");
//关闭进程和句柄
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
system("pause");
exit(0);
}
#include<iostream>
#include<windows.h>
using namespace std;
bool WinExec(LPCTSTR Filename)
{
PROCESS_INFORMATION processInfo;
STARTUPINFO si = { sizeof(si) }; // jernymy
ZeroMemory(&processInfo,sizeof(processInfo));
si.dwFlags = STARTF_USESHOWWINDOW; // jernymy 指定wShowWindow成员有效
si.wShowWindow = TRUE; // jernymy 此成员设为TRUE的话则显示新建进程的主窗口
ZeroMemory(&processInfo,sizeof(processInfo));
if(!CreateProcess(NULL, (char *)Filename,NULL,NULL,FALSE,CREATE_NEW_CONSOLE, NULL,NULL,&si,&processInfo)) // jernymy
// if(!CreateProcess(Filename,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE, NULL,NULL,NULL,&processInfo))
{
return false;
}
CloseHandle(processInfo.hThread);
CloseHandle(processInfo.hProcess);
return true;
}
int main()
{
WinExec("calc.exe");
return 0;
}