2011-09-08 135 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

相關問題