2010-05-17 132 views
1

我正在嘗試解決爲什麼我寫了一個NPAPI插件,它在執行通過Javascipt調用觸發的操作方面工作正常,無法使用CreateProcess()或ShellExecute()啓動來自通過Javascript調用指定的路徑的應用程序。從NPAPI插件啓動外部應用程序

我可以看似使用這些方法中的任何一種,並且它們返回成功,即沒有錯誤代碼。但該應用程序只是不啓動。我試圖修改調用它們時使用的參數,創建新的進程組等,但看起來沒有任何效果。

我知道這可能看起來有點安全風險,但是對於我們希望使用它的具體目的應該不是問題。

使用Windows XP專業版SP3,Firefox 3.5及以下代碼:

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 
if(CreateProcess(NULL, wFileName, NULL, NULL, FALSE, 
        CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP, 
        NULL, NULL, &si, &pi)) 
{ 
    bSuccess = true; // Close process and thread handles.  
    WaitForSingleObject(pi.hProcess,INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 
+0

什麼瀏覽器和windows版本? – 2010-05-17 08:24:34

+0

Windows XP專業版SP3和火狐3.5 – 2010-05-17 08:43:10

回答

0

無需任何代碼(段)咀嚼它真的很難給出有價值的提示:

我不看看爲什麼這不應該在XP上工作。 您確定CreateProcess()/ ShellExecute()調用成功嗎?

事情嘗試:

  • 請問,如果你傳遞一個無效的路徑的ShellExecute()調用也成功嗎?

  • 如果使用硬編碼路徑(例如notepad.exe的路徑,沒有空格的路徑等),會發生什麼情況?

  • 如果您嘗試啓動的應用程序的可執行文件被加載,請與ProcessMonitor(以前的filemon)進行檢查。

也許可執行文件無法啓動,因爲找不到依賴的DLL。
請記住,當從插件中啓動應用程序時,working/current目錄是瀏覽器可執行文件的目錄。
因此,可能找不到位於應用程序文件夾中的DLL。

+0

我已經嘗試了無效路徑,它肯定會返回一個錯誤,我也嘗試了你的建議,只是硬編碼它打開像記事本,沒有成功。 我也使用絕對路徑,所以它不應該關心當前目錄是什麼目錄。 我會看看進程監視器剛剛開始。 謝謝。 – 2010-05-17 13:35:24

+0

'depend.exe'在一些極少數情況下爲我創造了奇蹟 - 在FF的跟蹤模式中使用它可以提供有關失敗系統調用的更多信息。 – 2010-05-17 18:32:53

+0

嘗試在簡單的控制檯應用程序中運行相同的代碼,它啓動的exe很好,似乎是試圖從DLL內啓動它的事情? 不知道如何使用depends.exe來做你說的,你能提供一些步驟來做到這一點嗎?謝謝。 – 2010-05-18 14:58:42

相關問題