2013-04-26 76 views
1

我有一種情況,我希望程序A打開另一個程序B並讓程序B打開指定的文件。我目前正在嘗試通過使用CreateProcess並在命令行參數中傳遞文件路徑來實現此目的。這裏是我的代碼:CreateProcess打開加載文件的程序

STARTUPINFO si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 
CreateProcess("C:\\ProgramB.exe", "C:\\MyFile.txt", NULL, NULL, 
       FALSE, 0, NULL, NULL, &si, &pi); 

我在做什麼錯在這裏?程序B的DragAndDrop是真實的,並拖放文件到窗口中工作正常(我嘗試發送一個WM_DROPFILES消息以及沒有成功),和程序B可以打開文件就好,我打開文件對話框,但這個命令有問題稱它無法找到該文件。在評論

+0

那些是你在代碼中使用的確切路徑嗎?或者是文件系統的重定向與您混淆?你的命令行參數中是否有空格?你如何檢測錯誤? – 2013-04-26 16:42:18

+0

@DavidHeffernan沒有那些不是我正在使用的確切路徑,但我希望它適用於任何路徑(我測試的實際路徑類似於「C:\\ Users \\ Paul \\ Desktop \\ MyFolder \ \ MyFile.txt的「)。是的,命令行參數中有空格,因爲文件夾名稱中有一個空格,因此是我的引號。程序B有一個try/catch塊,但它並沒有給我任何信息。也許我應該更多地關注程序B. – CincinnatiProgrammer 2013-04-26 16:47:24

+0

Windows API不會引發異常。嘗試/捕獲不會有任何好處。您需要以正確的方式檢查錯誤。按照文檔中的描述檢查CreateProcess的返回值。如果您調用從命令窗口cmd.exe傳遞參數的可執行文件,會發生什麼情況?如果這樣做你會知道這是可能的。否則,現在放棄。 – 2013-04-26 16:49:10

回答

1

幽州,當你從命令提示符下執行

"C:\ProgramB.exe" "C:\MyFile.txt" 

,程序啓動,但不打開文件。這意味着該可執行文件不支持將文件名作爲參數傳遞。這就解釋了您撥打CreateProcess失敗的原因。它與命令解釋器cmd.exe完全相同。如果它失敗了,它會失敗的另一個。

它看起來像你正在嘗試可能不可能。

你也說你發送了一個WM_DROPFILES的過程。這不是你能做的那樣。如果應用程序確實支持拖放操作,那麼您將能夠自動打開文件,但與從不同流程發送WM_DROPFILES相比,這更加複雜。第一步是確認應用程序是否可以接受交互式拖放操作。

+0

我確定程序B可以接受拖放,但是像windows發送帶有WM_DROPFILES的PostMessage是非常複雜的,所以我放棄了這種方法。如果有更好的方法存在,你有什麼建議嗎?我知道總是從特定位置加載會容易得多,但我真的很想告訴程序B從哪裏獲取文件。 – CincinnatiProgrammer 2013-04-26 17:02:05

+0

通過命令行參數傳遞文件名與通過拖放傳遞文件名非常不同。如果ProgramB沒有編碼以支持命令行參數,那麼你就是SOL。你別無選擇,只能在沒有任何參數的情況下運行它,然後模擬WM_DROPFILES窗口消息(如果你遇到了麻煩,那就詢問另一個問題並顯示該代碼)。除非應用程序支持'IDropTarget'接口,否則將是一個理想的選擇。 – 2013-04-26 20:31:26

+1

@Paul對不起,我直到現在纔看到您的評論。我認爲雷米是對的,如果你無法通過網絡搜索解決這個問題,僞造拖放是值得一個新問題的。我確信雷蒙德陳寫了一些關於這方面的文章。是的,這裏是:http://blogs.msdn.com/b/oldnewthing/archive/2008/07/24/8768095。ASPX – 2013-04-26 20:51:10