专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

Windows2000下CreateProcess起步进程失败

发布时间:2011-06-28 12:14:32 文章来源:www.iduyao.cn 采编人员:星星草
Windows2000下CreateProcess启动进程失败
MFC应用程序,需要从windows2000支持到Win8.1,其中有一个模块需要启动一个第三方的exe进程,并使用管道获取其输出,此功能在XP至Win8.1下都运行成功,仅windows2000下启动失败。
windows2000为sp4,专业版和高级服务器版都测试失败。
此第三方exe在手动启动(直接双击)下,正常运行。
我的代码如下:
HANDLE hStdInWrite, hStdInRead, hStdInWriteUp; //用于重定向子进程输入的句柄
HANDLE hStdOutWrite, hStdOutRead, hStdOutReadUp; //用于重定向子进程输出的句柄
SECURITY_ATTRIBUTES stSa;
STARTUPINFO stSi;
PROCESS_INFORMATION stPi;
char acCmd[1024] = "";
DWORD dwCreationFlags = NORMAL_PRIORITY_CLASS;
DWORD ulExitCode = 0;
DWORD ulSingleRet = 0;
int iRet = 0;

stSa.lpSecurityDescriptor = NULL;//NULL则使用默认的进程描述符
stSa.bInheritHandle = true;//安全描述的对象能否被新创建的进程继承返回句柄,若为TRUE 则新进程继承该句柄
stSa.nLength = sizeof(SECURITY_ATTRIBUTES);

CreatePipe(&hStdOutRead, &hStdOutWrite, &stSa, 0);//创建子进程输出匿名管道
DuplicateHandle(::GetCurrentProcess(), hStdOutRead, ::GetCurrentProcess(), &hStdOutReadUp, 0, false,DUPLICATE_SAME_ACCESS);
::CloseHandle( hStdOutRead );

CreatePipe(&hStdInRead, &hStdInWrite, &stSa, 0);//创建子进程输入匿名管道
DuplicateHandle(::GetCurrentProcess(), hStdInWrite, ::GetCurrentProcess(), &hStdInWriteUp, 0, false,DUPLICATE_SAME_ACCESS);
::CloseHandle( hStdInWrite );

GetStartupInfo(&stSi);
stSi.hStdInput = hStdInRead;//重定向子进程输入
stSi.hStdOutput = hStdOutWrite;//重定向子进程输入
stSi.hStdError = GetStdHandle(STD_ERROR_HANDLE);
stSi.wShowWindow = SW_HIDE;
stSi.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
stSi.cb = sizeof(stSi);

if (strlen(stParam.acAppPath) > 0)
{
iRet = CreateProcess(stParam.acAppPath, stParam.acAppParam, NULL, NULL, TRUE, dwCreationFlags, NULL, NULL, &stSi, &stPi);//在win2000下以此种方式启动失败
}
else if (strlen(stParam.acShellCmd) > 0)
{
SHGetSpecialFolderPath(NULL, acCmd, CSIDL_SYSTEM, FALSE);
strcat(acCmd, "cmd.exe /c ");
strcat(acCmd, stParam.acShellCmd);
iRet = CreateProcess(NULL, acCmd, NULL, NULL, TRUE, dwCreationFlags, NULL, NULL, &stSi, &stPi);//在win2000下以此种方式启动失败
}
if (0 == iRet)//CreateProcess()执行成功则返回非0值
{
return FALSE;
}

CloseHandle(hStdInRead);
if (strlen(stParam.acInput) > 0)
{
WriteFile(hStdInWriteUp, stParam.acInput, strlen(stParam.acInput), &ulSingleRet, NULL);
}

iRet = TRUE;
ulSingleRet = WaitForSingleObject(stPi.hProcess, INFINITE);
if (ulSingleRet != WAIT_OBJECT_0 && !GetExitCodeProcess(stPi.hProcess, &ulExitCode))
{
if (ulSingleRet == WAIT_TIMEOUT)
{
sprintf_s(stParam.acRetInfo, sizeof(stParam.acRetInfo), "Process exit timeout, LastErr[%d]", GetLastError());
//return WAIT_TIMEOUT;
}
else
{
sprintf_s(stParam.acRetInfo, sizeof(stParam.acRetInfo), "Process exit error, WaitForSingleObject()=[%d], GetExitCodeProcess()=[%d], LastErr[%d]", ulSingleRet, ulExitCode, GetLastError());
}
iRet = FALSE;
}

CloseHandle(hStdOutWrite);//在调用ReadFile前必须关闭该句柄,否则由于父进程的管道写入端有未关闭的Write句柄,ReadFile最后无法返回0
if (iRet && stParam.bIsGetOutput)
{
char acTmp[2048] = "";//保存读入数据的临时缓冲区
unsigned long ulWantedBytes = 2048;//欲读入的字节数
unsigned long ulRealReadBytes;//实际读取的字节数

memset(stParam.acOutput, 0, sizeof(stParam.acOutput));
while (ReadFile(hReadPipe, (LPVOID)acTmp, ulWantedBytes, &ulRealReadBytes, NULL) && ulRealReadBytes > 0)
{
strcat_s(stParam.acOutput, acTmp);
memset(acTmp, 0, sizeof(acTmp));
}
}
CloseHandle(hStdOutReadUp);
CloseHandle(hStdInWriteUp);
TerminateProcess(stPi.hProcess, 0); 
CloseHandle(stPi.hProcess);
CloseHandle(stPi.hThread);

if (strlen(stParam.acAppName) > 0)
{
KillWinProcess(stParam.acAppName);
}
if ((0 == strlen(stParam.acAppPath)) || (strlen(stParam.acShellCmd) > 0))
{
KillWinProcess("conhost.exe");//命令行程序的宿主进程
KillWinProcess("cmd.exe");
}
------解决方案--------------------
ShellExecuteEx打开不行!?
------解决方案--------------------
在Win2000下用depends.exe查看该exe依赖的dll
------解决方案--------------------
引用:
回复5楼:仍然执行失败,输出install failed.谢谢关注!

不通过管道行不行?
如果可以,那么先不通过线程管道。通过命令管道把控制台窗口信息输出到文件,然后再读取文件。
控制台命令管道输出到文件的用法是:
命令行 > 文件名
------解决方案--------------------
LsaLookupNames2 Function

The LsaLookupNames2 function retrieves the security identifiers (SIDs) for specified account names. LsaLookupNames2 can look up the SID for any account in any domain in a Windows forest.
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: