2016-07-02 45 views
0

就像在下面的例子中,我試圖從使用Windows API函數CreateProcess的Windows應用程序啓動Google Googles Chrome瀏覽器。如果只知道其名稱,如何使用CreateProcess打開程序?

我遇到的問題是我不知道Chrome應用程序(或程序路徑中的任何其他應用程序)的路徑。我怎樣才能得到這個?

在下面的代碼中,我評論了三個不同的例子。如果我啓動「calc」,則計算器將按照Windows/System32路徑啓動。如果我使用應用程序的完整路徑啓動Chrome,它也會運行。但是,如果我省略了路徑並嘗試啓動「chrome」,則會出現錯誤#2。

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 

void _tmain() 
{ 

    char* cmd = "calc"; // works... calc.exe is in windows/system32 
    // char* cmd = "chrome"; // doesn't work... how can I add the path if it's not known (e.g. windows installed on D:\) 
    // char* cmd = "c:/program files (x86)/google/chrome/application/chrome"; // works (even without extension .exe) 

    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

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

    // Start the child process. 
    if (!CreateProcess(NULL, // No module name (use command line) 
     cmd,   // Command line 
     NULL,   // Process handle not inheritable 
     NULL,   // Thread handle not inheritable 
     FALSE,   // Set handle inheritance to FALSE 
     0,    // No creation flags 
     NULL,   // Use parent's environment block 
     NULL,   // Use parent's starting directory 
     &si,   // Pointer to STARTUPINFO structure 
     &pi)   // Pointer to PROCESS_INFORMATION structure 
     ) 
    { 
     printf("CreateProcess failed (%d).\n", GetLastError()); 
     return; 
    } 

    // Wait until child process exits. 
    WaitForSingleObject(pi.hProcess, INFINITE); 

    // Close process and thread handles. 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 

注意:如果我在Windows運行命令窗口中輸入「chrome」(不帶引號),Chrome也會啓動。我在尋找的是同樣的功能。但是,我的應用程序可以駐留在任何地方,不一定與Chrome位於同一個驅動器上。

+0

當您的應用程序正在工作時,嘗試使用'system(「path」)'來查看PATH env.variable的內容 – VolAnd

+0

當您鍵入'calc'並鍵入'chrome'時,在cmd控制檯中會發生什麼? –

+1

我只是需要類似的東西,通過在調用'CreateProcess'前調用'PathFindOnPath'來查找完整路徑來解決問題。但在這個特定的情況下,因爲想要推出Chrome瀏覽器,我認爲David Heffernan的回答更好。我還要求你重新考慮明確啓動Chrome的想法。如果用戶喜歡使用不同的瀏覽器,比如Firefox或Opera,該怎麼辦?只需使用ShellExecuteEx啓動網頁或HTML文檔,即可允許用戶的默認瀏覽器打開它。 –

回答

5

如果你真的必須使用CreateProcess,那麼你將需要找出它安裝在哪裏,並通過全可執行文件的路徑。這將需要一些註冊表黑客入侵。

但是,我覺得有一個更簡單和更強大的方法。 Chrome將自己註冊到AppPaths註冊表中,因此ShellExecuteEx的文件指定爲L"chrome",默認動詞將執行該作業。

+0

@ david-hefferman:因爲我需要訪問進程信息,所以我必須使用CreateProcess。但是,你讓我走上了正確的軌道。在我的解決方案中,我最終使用RegOpenKeyEx獲取註冊表項的句柄,然後使用RegQueryValueEx將值從其中取出。並不像我預期的那麼微不足道,但它效果很好。 –

+0

並非如此。您可以從ShellExecuteEx獲取進程句柄。 –

+0

我感興趣的是PROCESS_INFORMATION結構。我不知道(並且仍然不知道)如何使用ShellExecuteEx獲得此信息。如果可能的話,它可能會更容易。但是,一旦我明白瞭如何做到這一點,那隻需要幾行代碼。 –

0

這很可能與WinAPI和CreateProcess函數無關,但僅適用於環境變量PATH。默認情況下,它包含所有標準Windows命令的路徑,例如calcnotepad,但您必須爲稍後添加的其他命令(無論是在Program Files還是其他任何位置)添加其他命令的路徑。

怎麼辦:

  • 仔細注意的chrome實際路徑
  • 打開控制面板/系統/高級的系統參數
  • 單擊環境變量:你會發現一個PATH(不區分大小寫)在用戶和系統變量中。
  • 添加路徑上的一個鉻(系統是指意味着所有用戶)

現在應該可以不指定它的完整路徑啓動Chrome瀏覽器。

注意:不能確定針對所有上述的實際標籤,我自己的箱子說法語......

+0

*「calc」*或*「notepad」*不是命令。他們是程序或應用程序。 – IInspectable

相關問題