2012-11-08 61 views
1

我收到錯誤代碼2,無法找到該文件。但我已經嘗試了完整的路徑而沒有。 我已經沒有運氣讓這個過程開始,我不知道我的錯誤是什麼,有人可以指出它嗎?CreateProcess將無法啓動

這是全碼:

#include "stdafx.h" 
#include <map> 
#include <psapi.h> 
#include "shlwapi.h" 

#define ERROR_FILE_NOT_FOUND = 2; 

void Debug(char* path[]) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    char* p = path[0]; 
    char* args = path[1]; 

    int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args, NULL, NULL, false, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 

    if (!dwProcess) 
    { 
     DWORD dwLastErrorCode = GetLastError(); 
     printf("Error: %d", dwLastErrorCode); 
    } 

    DEBUG_EVENT debug_event = {0}; 
    DWORD dwContinueStatus = DBG_CONTINUE; 
    DWORD dwResume   = DBG_EXCEPTION_HANDLED; 

    while (!WaitForDebugEvent(&debug_event, INFINITE)) 
    { 
     switch(debug_event.dwDebugEventCode) 
     { 
      case EXCEPTION_DEBUG_EVENT: 
      { 
       EXCEPTION_DEBUG_INFO& exception = debug_event.u.Exception; 

       if (exception.ExceptionRecord.ExceptionCode == 0x0EEDFADE && exception.dwFirstChance) 
        dwContinueStatus = dwResume; 
      } 
     } 
     ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, dwContinueStatus); 
    } 
} 

int main(char* argv[]) 
{ 
    char* p[2] = { "Notepad.exe", "args" }; 
    Debug(p); 

    return 0; 
} 

任何幫助表示讚賞。

+1

你有沒有嘗試執行錯誤檢查?這是你應該做的第一件事。在你這樣做之後,你可能會意識到哪些參數導致了麻煩,以及爲什麼盡你所能編譯代碼是一個壞主意。這是一個開始:*如果函數失敗,返回值爲零。要獲得擴展錯誤信息,請致電GetLastError。* – chris

+0

需要爲notepad.exe提供絕對路徑? – billz

+0

@billz,你不應該爲notepad.exe。它通常位於PATH覆蓋的目錄中。 – chris

回答

4
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args, 

↑不要投char*wchar_t*

刪除所有C演員,並更快樂。 :-)

實際上,使用寬字符串(wchar_t爲基礎)來處理Windows API。

使用Visual C++獲取寬字符程序參數的簡單方法是使用wmain而不是標準main


修訂我忘了是這樣。那麼當你投char*wchar_t*時究竟發生了什麼

那麼在Windows中,每個wchar_t都是2個字節。這意味着您的字符串中的每個連續的char值將被視爲一個wchar_t值,如果事件不會崩潰。它可能會崩潰,因爲寬字符串的空終止符是2個零字節,而您的char字符串只能保證一個零字節,所以從CreateProcess代碼的角度來看,您的字符串可能會無限期地繼續。

總之,不要投。

每個演員都對編譯器說,「閉嘴,編譯器,因爲我真的明白我在做什麼,我不是這樣做的! 」

如果一個人實際上並不知道自己在說什麼,那麼效果就是讓沉默的工具不斷嘗試幫助您避免災難。

2

您必須使用完整路徑而不是notepad.exe

該字符串可以指定完整路徑和模塊的文件名 執行,也可以指定部分名稱:從CreateProcess資料爲準。在部分名稱爲 的情況下,該功能使用當前驅動器和當前目錄 完成規範。 該功能不會使用搜索路徑。 此參數必須包含文件擴展名;假定沒有默認的 擴展名。

如果你想notepad.exe也打開該文件,你需要重複notepad一部分lpCommandLine。從同一個頁面:

如果lpApplicationName和lpCommandLine都是非NULL,則 空值終止字符串由lpApplicationName指出指定 模塊來執行,和空值終止字符串由 lpCommandLine指定指了指命令行。新進程可以使用GetCommandLine來檢索整個命令行。 用C編寫的控制檯進程 可以使用argc和argv參數來解析命令 一行。因爲argv [0]是模塊名稱,所以C程序員通常在命令行中重複模塊名稱作爲第一個標記。

+0

它仍然不會像OP那樣工作。 – chris

+0

它僅在'PATH'中查找'lpCommandLine',而不是'lpApplicationName'。 – kichik

1

您正在使用Ansi緩衝區作爲您的參數數據,但您正在調用Unicode版本CreateProcess()而不是Ansi版本。擺脫你的類型轉換(編譯器會提醒你你的錯誤,你已經使用NT它們),然後直接調用CreateProcessA()

//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...); 
CreateProcessA(p, args, ...);