C++ CreateProcess在某些计算机上工作,而在其他计算机上不工作。为什么?

C++ CreateProcess在某些计算机上工作,而在其他计算机上不工作。为什么?,c++,windows-7,intel,access-denied,createprocess,C++,Windows 7,Intel,Access Denied,Createprocess,我使用的应用程序通过CreateProcess调用另一个应用程序。我使用的是Win7 64位。被调用的应用程序是通过管道接收数据的控制台。调用代码如下所示: STARTUPINFOA si; PROCESS_INFORMATION pi; GetStartupInfoA(&si); memset( &si, 0, sizeof(STARTUPINFOA) ); memset( &pi, 0, sizeof(pi) ); si.cb = sizeof(STARTUPINFO

我使用的应用程序通过CreateProcess调用另一个应用程序。我使用的是Win7 64位。被调用的应用程序是通过管道接收数据的控制台。调用代码如下所示:

STARTUPINFOA si;
PROCESS_INFORMATION pi;
GetStartupInfoA(&si);
memset( &si, 0, sizeof(STARTUPINFOA) );
memset( &pi, 0, sizeof(pi) );
si.cb = sizeof(STARTUPINFOA);
char cmdline[MAX_PATH];
sprintf(cmdline,"\"%s\" %s",AppToCallName,PipeName);
BOOL bRet = CreateProcessA(NULL,cmdline,NULL,NULL,FALSE,CREATE_NEW_CONSOLE|CREATE_BREAKAWAY_FROM_JOB,NULL,NULL,&si,&pi);
在我的电脑上(我试了两台),它可以工作。在其他情况下,它返回(bRet=)FALSE,然后GetLastError()返回5,这意味着访问被拒绝

我想不出问题出在哪里。糟糕的是它对我有效,所以我无法调试它

我的设置是:

  • Win7 Pro 64位SP1

  • VStudio 2005 SP1

  • < L> > P>(编译器使用:英特尔C++ 9.1

我将很高兴提供更多的设置信息,如果你需要它


有什么想法吗?

CreateProcess
使用与调用进程相同的权限。如果进程未正确初始化,它也将终止进程,因此您应该等待并验证启动的进程,即使
CreateProcess
返回成功。但是,您的访问被拒绝问题可能与调用进程无关对您试图在目标计算机上启动的任何应用程序具有执行或写入权限

除了函数成功时的
GetLastError
之外,请检查
GetExitCodeProcess
,因为这可能是您的下一个问题


也供参考:

什么类型的应用程序触发拒绝访问?在这些情况下,命令行上有什么?另外,您是否以提升用户的身份运行代码?我建议您不要这样做,因为如果您这样做,您自己不会发现此错误…触发拒绝访问的应用程序是一个简单的控制台应用程序,它将(将)通过命名管道从调用应用程序接收数据。管道创建正确。命令行如下所示:“\”MyConsoleApp.exe \“管道名”调用方和被调用的应用程序都位于同一目录中。此外,我们在这里都有管理员权限。即使是那些无法在那里的计算机上运行我的应用程序的人。谢谢。更多信息:在我的计算机上,当我从我的HD运行它时,它会成功,但当我从USB密钥运行它时,它会失败。计时???CreateProcess内部如何工作?它是否启动进程ss异步返回?如果是,它如何知道它是否成功或失败?另一方面,如果进程是同步创建的,怎么可能是时间问题?第二个应用程序将以相同的速度运行,无论它是从HD还是从USB密钥加载的…我感到困惑!“如果在函数返回时尚未初始化,它还将终止进程"这并不是一个确切的引用。MSDN说CreateProcess在初始化完成之前返回,因此即使CreateProcess成功,该进程也可能会因为初始化失败而终止。@dom当您从USB运行应用程序时,系统可能会首先在本地复制它;这可能是失败的原因。请尝试filemon-这可能会很好地说明问题所在失败。@dom_beau,使用带有进程句柄的WaitForSingleObject等待进程终止。然后使用GetExitCodeProcess检查退出代码。