2011-09-08 134 views
0

我工作的应用程序通过CreateProcess调用另一个应用程序。我在Win7 64位。被调用的应用程序是一个通过管道接收数据的控制台。调用代码如下所示:CreateProcess适用于某些计算机,而不适用于其他计算机。为什么?

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,这意味着ACCESS_DENIED。

我找不出问题在哪里。不好的一点是它适用于我,所以我无法调试它!

我的设置是:

  • Win7的临64位SP1

  • VStudio 2005 SP1

  • (编译器用于:英特尔C++ 9.1

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

有什么想法?

+0

什么类型的应用程序触发ACCESS_DENIED?在这些情况下,命令行上有什么?另外,你是否以高级用户身份运行代码?我会建议不要这样做,因为如果你这样做,你就不会发现这个错误... –

+0

触发ACCESS_DENIED的应用程序是一个简单的控制台应用程序,它将(将)通过命名管道从调用应用程序接收数据。管道创建是正确的。命令行如下所示:“\”MyConsoleApp.exe \“ThePipeName”调用者和被调用的应用程序位于同一个目录中。 –

+0

另外,我们在这里都有管理员权限。即使那些无法在那里运行我的应用程序的电脑。 –

回答

0

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

除了GetLastError功能成功时检查GetExitCodeProcess,因为这可能是您的下一个问题。

而且以供参考:http://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx

+0

谢谢。更多信息:在我的电脑上,当我从HD上运行它时,它会成功,但当它从USB钥匙运行时会失败。定时???? –

+0

CreateProcess如何在内部工作?它是否异步启动进程然后返回?如果是这样,它是如何知道它是成功还是失败?另一方面,如果进程是同步创建的,那么时间问题怎么可能呢?第二款应用程序将以相同的速度运行,从高清或USB密钥加载它......我很神秘! –

+0

“如果它在函数返回时还没有初始化,它也会终止这个过程”这并不是一个确切的引用。 MSDN表示CreateProcess在初始化完成之前返回,所以即使成功的CreateProcess,由于初始化失败,该进程仍可能会终止。 – pezcode

相关问题