请教一个创建进程的问题!

tom255 2001-07-23 05:56:16
我用如下代码创建进程:
问题:我只能创建一个进程,好像系统判断是否有该进程,如果有,就不创建,我想可能是参数问题,但是不知道如何处理:
STARTUPINFO sInfo;
sInfo.cb = sizeof(STARTUPINFO);
sInfo.lpReserved = NULL;
sInfo.lpReserved2 = NULL;
sInfo.cbReserved2 = 0;
sInfo.lpDesktop = NULL;
sInfo.lpTitle = NULL;
sInfo.dwFlags = 0;
sInfo.dwX = 0;
sInfo.dwY = 0;
sInfo.dwFillAttribute = 0;
sInfo.wShowWindow = SW_SHOW;

CreateProcess(NULL,
"dir /s",
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&sInfo,
&p);
...全文
102 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tom255 2001-07-24
  • 打赏
  • 举报
回复
谢谢各位的帮助,不过问题还是没有解决。
我现在这样调用
CreateProcess(NULL,
"cmd.exe /c ""command_line para""",
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&sInfo,
&p);

如果是调用 NOTEPAD.EXE ,每一次调用新起一个进程,如果是CONSOLE 程序,第一次起来的竟然是CMD.EXE ,然后的调用每一个(即使相同的CONSOLE程序)都可以正常起来!
糊涂!请各位大虾指点一二
vcsongs 2001-07-23
  • 打赏
  • 举报
回复
一段演示程序...

CString m_strOutput;
CString m_strFileName = "c:\\command.com /c dir"; //"c:\\pwin\\ping.exe";

void CTestDlg::OnButton1()
{
SECURITY_ATTRIBUTES lsa;
STARTUPINFO si;
PROCESS_INFORMATION pi, *lppi;
HANDLE hReadPipe, hWritePipe;

lsa.nLength = sizeof(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor = NULL;
lsa.bInheritHandle = TRUE;

lppi = π
CWaitCursor waitCursor;

if(!CreatePipe(&hReadPipe, &hWritePipe, &lsa, 0))
{
AfxMessageBox("Error");
return;
}

memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdOutput = hWritePipe;

if(!CreateProcess(NULL, m_strFileName.GetBuffer(m_strFileName.GetLength()), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
AfxMessageBox("Error");
return;
}

DWORD cchReadBuffer;
CString strText;
TCHAR ph[5000];
m_strOutput.Empty();

for(;;)
{
cchReadBuffer = 0;
if(!PeekNamedPipe(hReadPipe, ph, 1, &cchReadBuffer, NULL, NULL))
break;

if(cchReadBuffer)
{
if(!ReadFile(hReadPipe, ph, 4096, &cchReadBuffer, NULL))
break;
ph[cchReadBuffer] = 0;
m_strOutput += ph;;
}
else
if(WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0)
break;
Sleep(500);
}

ph[cchReadBuffer] = 0;
m_strOutput += ph;

CloseHandle(hReadPipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hWritePipe);

AfxMessageBox(m_strOutput);
}
vcsongs 2001-07-23
  • 打赏
  • 举报
回复
你的"dir /s" 是创建不来进程的. 因为dir是command.com内部的一个内部命令...
所以...

把命令行换成: "c:\\command.com /c dir /s" 试试看...
111222 2001-07-23
  • 打赏
  • 举报
回复
HWND hd = FindWindow(NULL,"那个进程的窗口名");
if(hd == NULL)
//像阿丰说的那样创建进程
else
::SetForegroundWindow(hd);
NowCan 2001-07-23
  • 打赏
  • 举报
回复
我也觉得panda说得有道理。如果那个进程不是你写的,那么就难说了。
panda_w 2001-07-23
  • 打赏
  • 举报
回复
是不是你要创建的进程之允许有一个实例呢?
ahphone 2001-07-23
  • 打赏
  • 举报
回复
以前有人贴过类似的帖子,仅供参考:
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
if(!CreateProcess(NULL, //create dos process ;
(char*)(LPCTSTR)szMasmCommandLine,
//the command line,for example "C:\\windows\\commmand.exe";
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi))
{
CloseHandle(hFileHandle);
MessageBox(NULL,_TEXT("create process fail!\r\n"),_TEXT("compile"),MB_OK);
return 0;
}
WaitForSingleObject(pi.hProcess,INFINITE);//wait,until the process end!
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
ahphone 2001-07-23
  • 打赏
  • 举报
回复
你在这句话加if判断一下,看看到底出了什么问题,
CreateProcess(NULL,
"dir /s",
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&sInfo,
&p);
wobuhui 2001-07-23
  • 打赏
  • 举报
回复
你的程序名是什么?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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