我試圖實現一個將自己註冊爲DDE服務器的應用程序,以便它對我們的自定義「.qsx」文件類型正確響應,就像WinWord響應「 .docx「文件類型。DDE:實現通過Shell和ddeexec正確啓動的應用程序
即
- 如果應用程序已經運行,並在「.qsx」文件有人雙擊然後我們想要的已經打開的應用程序接收DDE打開命令,並打開相關文件。
- 但是,如果應用程序尚未運行,那麼shell將啓動我們的應用程序,然後與應用程序建立DDE連接並告訴它像以前一樣打開文件。
我們的第1部分工作完美無缺。
但是,對於第2部分,Shell會啓動命令,但隨後出現「將命令發送到程序時出現問題」的錯誤。這對應於從「ShellExecute」Windows API函數返回的返回碼「SE_ERR_DDEFAIL」(29)。
事實上,我寫了一個名爲「ShellExecute.exe」的自定義控制檯應用程序,它可以完全獨立於explorer.exe來重現此問題。
如果我運行ShellExecute.exe並且我們的「DDE server」應用程序已經啓動,它可以正常工作。 如果我爲一個「.docx」文件運行ShellExecute.exe並且WinWord沒有運行,WinWord正確啓動並加載文件 如果我爲我們的「.qsx」文件運行ShellExecute.exe,並且我們的應用程序沒有運行,ShellExecuteEx啓動應用程序,但立即返回與SE_ERR_DDEFAIL之前我們的服務器應用程序甚至有機會註冊爲DDE服務器。
由於某些原因,對於WinWord,ShellExecute似乎等待它啓動。
我試過運行procmon.exe運行這兩種情況,看看ShellExecute可能在註冊表中尋找什麼,以區別我們的情況與WinWord.exe,但我找不到任何東西。
我真正需要的是ShellExecute算法的源代碼,以便我可以找出它爲什麼適用於WinWord,但不適用於我們的自定義擴展。
任何人都可以詳細解釋ShellExecute是如何啓動一個應用程序,以及如何知道如何等待應用程序註冊爲DDE服務器?
你確定MS Word使用DDE,而不僅僅是告訴自己的前一個實例打開文件然後退出? – hamstergene
是的,我確定。從查看註冊表鍵和許多文章中可以清楚地看出。 –
ShellExecute的源代碼不是你所需要的。你需要的是修復你的代碼。既然你沒有向我們展示你的代碼,那麼很難提供幫助。 –