关于创建进程的问题

lt114896 2011-06-13 06:31:22

#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;
}


我用上面的程序创建进程,他老是显示显示内存应用错误,求高手解释下,错在哪儿了,calc是系统自带的计算器,我把它考到自己工程的目录下还是不行!
...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lt114896 2011-06-14
  • 打赏
  • 举报
回复
创建进程应该注意什么啊?
lt114896 2011-06-14
  • 打赏
  • 举报
回复
我想问一下我这样做那儿出错了,一楼说用法不对,你可不可以说一下哪儿不对,我试了下,你那样做是可以的,为啥要那样做啊,我这个有什么问题?希望指点下
ryfdizuo 2011-06-13
  • 打赏
  • 举报
回复
查一下msdn~
yfk 2011-06-13
  • 打赏
  • 举报
回复
一个例子:

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);

}
jernymy 2011-06-13
  • 打赏
  • 举报
回复
用法出错了,仅供参考

#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;
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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