2016-01-06 98 views
0

我試圖在C++中使用msdn function (CreateProcess)來運行應用程序。我沒有得到任何錯誤,但是當我運行它時,它崩潰了。我所做的也注意到它創建了一個過程,但它沒有運行它應該的文本文件。創建進程時崩潰

我的代碼:

#include <windows.h> 
#include <iostream> 
#include <string> 

using namespace std; 

void createPro(); 

int main() 
{ 
    createPro(); 
} 

void createPro() { 

    LPCTSTR lpApplicationName = "C:/Users/Andyy/Desktop/hello.txt"; 

    LPSTARTUPINFO lpStartupInfo; 
    LPPROCESS_INFORMATION lpProcessInfo; 

    memset(&lpStartupInfo, 0, sizeof(lpStartupInfo)); 
    memset(&lpProcessInfo, 0, sizeof(lpProcessInfo)); 


    if (!CreateProcess(lpApplicationName, 
        NULL, NULL, NULL, 
        NULL, NULL, NULL, NULL, 
        lpStartupInfo, 
        lpProcessInfo 
       ) 
    ) { 
    cout << "Failed to create process" << lpApplicationName << endl; 
} 

    cout << "Program exec: " << lpApplicationName << endl; 
} 

它創建的過程,但它無法運行的文本文件,並沒有錯誤編譯器中顯示。提前致謝。 返回錯誤:處理返回-1073741819(0xC0000005)

+0

您的'lpApplicationName'應該是一個可執行文件的名稱。相反,它指的是一個文本文件,而'CreateProcess'可能會因爲無法執行文本文件而失敗。也許用文字來描述你想做什麼? – kfx

+0

「崩潰」。不,它不會崩潰。崩潰是由於未處理的,未收集的錯誤導致的進程異常終止。忽略返回值不會導致進程終止。 – MSalters

+0

我試着用一個可執行文件,它也沒有工作。 (錯誤:Windows控制檯命令停止工作) – Andy

回答

5

CreateProcess用於從可執行文件創建過程對象。您正在傳遞一個不是可執行文件的文本文件。想必你實際上是試圖在默認的文本編輯器中顯示文本文件。使用ShellExecuteEx來做到這一點。


除此之外,你不分配所需要您的來電CreateProcess兩個結構。而是聲明指向結構體的指針,並將指針保持爲未初始化狀態。我期望這是訪問衝突錯誤0xC0000005的原因。對於未來的參考,你會分配和初始化這些結構像這樣:

STARTUPINFO StartupInfo = { sizeof StartupInfo }; 
PROCESS_INFORMATION ProcessInfo = { 0 }; 

然後通過&StartupInfo&ProcessInfoCreateProcess。當然,我只是爲了完整性而添加這個建議。您將丟棄與CreateProcess有關的所有代碼,並改爲撥打ShellExecuteEx

+0

非常感謝您的回覆。所以我確實將lpApplicationName更改爲exe的目標並獲得相同的錯誤。我也嘗試聲明指向結構的指針,但仍然意外關閉。 – Andy

+0

不要使用'CreateProcess'來打開文本文件。使用'ShellExecuteEx'。如果你有一個新問題,請問問題。請不要期望通過評論進行長時間的調試。 –

+0

好吧,無論如何,我無法開始工作這個功能,所以我可能會搜索其他不包含system()的東西。 (PD:我確實想要啓動一個.exe,我只是使用了錯誤的例子來發布它) – Andy