人人妻人人澡人人爽人人精品av_精品乱码一区内射人妻无码_老司机午夜福利视频_精品成品国色天香摄像头_99精品福利国产在线导航_野花社区在线观看视频_大地资源在线影视播放_东北高大肥胖丰满熟女_金门瓶马车内剧烈运动

首頁(yè)>國(guó)內(nèi) > 正文

思維調(diào)試:理解 DDE 的初始化過(guò)程

2023-08-28 10:23:48來(lái)源:今日頭條


【資料圖】

最近有人問(wèn)我下面這個(gè)問(wèn)題,我們依然可以使用之前我提到的 “思維調(diào)試” 來(lái)研究研究。

我們碰到了一個(gè)技術(shù)問(wèn)題。當(dāng)在資源管理器中雙擊打開(kāi)文檔時(shí),資源管理器不會(huì)啟動(dòng)我們的應(yīng)用程序。更加奇怪的是,如果我們將一個(gè)調(diào)試器掛接到資源管理器進(jìn)程,并在 kernel32 模塊的 CreateProcessW 處下斷點(diǎn),然后等待 CreateProcess 返回,并在調(diào)試器中繼續(xù)執(zhí)行,則文檔可以正常打開(kāi)。但是,如果我們不做任何等待,應(yīng)用程序也可以正常打開(kāi),但是它不會(huì)加載文檔,在這種情況下,我們得到了這樣的錯(cuò)誤信息:Windows 找不到 ‘a(chǎn)bc.lit’。請(qǐng)確保你輸入了正確的文檔名稱,然后重試。下面是我們使用的命令行:“F:\Program Files\LitSoft\LitWare\LitWare.exe” /dde到底是哪里出了問(wèn)題呢?

如果你仔細(xì)研究過(guò) DDE 初始化的工作原理文章,那么我想你應(yīng)該已經(jīng)知道原因了。

回想一下,通過(guò) DDE 打開(kāi)文檔是通過(guò)首先查找 DDE 服務(wù)器來(lái)完成的,如果未找到,則手動(dòng)啟動(dòng)服務(wù)器并重試。上面的命令行顯然已注冊(cè)為與 ddeexec 關(guān)聯(lián)的命令。我們有兩個(gè)線索:首先是文檔名稱本身在命令行上不存在。(這不可能是直接執(zhí)行,因?yàn)槌绦虿恢浪鼞?yīng)該打開(kāi)什么文檔!但是這條線索是命令行上的短語(yǔ) /dde。

顯然,資源管理器嘗試第二個(gè) DDE 對(duì)話打開(kāi)文檔時(shí)出現(xiàn)問(wèn)題。讓資源管理器等待幾秒鐘可以解決問(wèn)題的事實(shí)使原因顯而易見(jiàn):DDE 服務(wù)器初始化和偵聽(tīng)自身的速度很慢。資源管理器啟動(dòng)服務(wù)器并嘗試與其通信,但服務(wù)器尚未準(zhǔn)備就緒,因此不響應(yīng) DDE 啟動(dòng)。

如何解決這個(gè)問(wèn)題?

外殼程序假定 DDE 服務(wù)器在輸入空閑時(shí)已準(zhǔn)備好接受連接。一旦 DDE 服務(wù)器上的 WaitForInputIdle 返回,資源管理器將第二次嘗試啟動(dòng) DDE 會(huì)話。此修復(fù)程序是讓應(yīng)用程序在開(kāi)始處理消息之前啟動(dòng)并運(yùn)行其 DDE 服務(wù)器。我的猜測(cè)是應(yīng)用程序?qū)⑵?DDE 服務(wù)器移動(dòng)到后臺(tái)線程以提高啟動(dòng)性能,因?yàn)?DDE 服務(wù)器不參與正常的程序操作。但是這太糟糕了,當(dāng)傳遞 /dde 標(biāo)志時(shí),程序忘記在輸入空閑之前啟動(dòng)并運(yùn)行 DDE 服務(wù)器。讓 DDE 服務(wù)器運(yùn)行很重要,但它錯(cuò)過(guò)了正確的時(shí)間點(diǎn)。

總結(jié)

如果你要實(shí)現(xiàn)了一個(gè) DDE 服務(wù)器,請(qǐng)確保在主線程開(kāi)始處理消息之前就啟動(dòng)它。否則,應(yīng)用程序啟動(dòng)和嘗試與之通信的外殼之間存在競(jìng)爭(zhēng)條件。

關(guān)鍵詞:

相關(guān)新聞

Copyright 2015-2020   三好網(wǎng)  版權(quán)所有 聯(lián)系郵箱:435 22 [email protected]  備案號(hào): 京ICP備2022022245號(hào)-21