2011-10-28 37 views
2

我試圖實現一個將自己註冊爲DDE服務器的應用程序,以便它對我們的自定義「.qsx」文件類型正確響應,就像WinWord響應「 .docx「文件類型。DDE:實現通過Shell和ddeexec正確啓動的應用程序

  1. 如果應用程序已經運行,並在「.qsx」文件有人雙擊然後我們想要的已經打開的應用程序接收DDE打開命令,並打開相關文件。
  2. 但是,如果應用程序尚未運行,那麼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服務器?

+1

你確定MS Word使用DDE,而不僅僅是告訴自己的前一個實例打開文件然後退出? – hamstergene

+0

是的,我確定。從查看註冊表鍵和許多文章中可以清楚地看出。 –

+1

ShellExecute的源代碼不是你所需要的。你需要的是修復你的代碼。既然你沒有向我們展示你的代碼,那麼很難提供幫助。 –

回答

-1

請不要使用DDE。這是一種荒謬的過時方式,會導致各種問題和掛起,並取決於註冊表。

現代的做法是使用全局互斥鎖。如果您搜索堆棧溢出,您會發現幾十個人詢問同一個問題(maybe start here

+1

全球互斥?您如何使用互斥鎖發送數據?您需要使用FindWindow + SendMessage(...,WM_COPYDATA),然後回到DDE所帶來的基於消息的問題。即使你使用互斥鎖,它也不應該是全局的(全局\前綴),它應該是每個用戶(你不想阻止運行你的應用的其他會話中的用戶) – Anders

5

在XP +上運行的應用程序應爲use IDropTarget以避免在掛起窗口時出現DDE問題。

當您使用DDE shell assumes您的DDE服務器啓動並運行之前,您開始您的消息循環...

相關問題