調試某手寫IME時遇到的載入手寫庫失敗的問題在 WinCE6.0 下使用此手寫IME SDK 做了一個單獨的手寫輸入程式A(MFC Dialog 架構)。正常情況下,可以正常使用。此 A 程式,採用 LIB 方式載入此的手寫 SDK。在運行某一帶手寫輸入的程式 B 後,A 程式無法運行。首先懷疑 B 程式中也使用了此手寫 SDK,導致載入衝突。但仔細想想程式 B 和程式 A 應該運行在不同的進程空間,且最後確定程式 B 並未使用此手寫。進一步測試發現,如果程式 A 先運行,再程式 B 程式。雖然 B 可以正常運行,在手寫輸入後無法識別。由於 A 程式,在 B 程式運行後根本無法運行,無法進行調試來分析問題的原因。參考再三,決定將 A 程式調用手寫 SDK 的方式由靜態載入修改為動態載入。分析 A 程式,發現只調用了 4 個手寫 SDK 的程式。採用 LoadLibrary() 載入 DLL 和 GetProcAddress() 載入此 4 個函數後(1) 在不運行 B 程式時,4 個函數載入都成功,手寫功能可以正常使用;(2) 在先運行 B 程式後,發現有三個函數載入是沒有問題的,其中一個函數無法載入成功,GetLastError() 得到的錯誤是: 87(參數不正確)。在修改為動態載入後,測試過先運行 A 程式,再運行 B 程式。和以前的結果是一樣的,B 程式的手寫無法識別。再次測試,將 A 程式中對手寫 SDK 的初始化代碼刪除後,先運行 A、再運行 B 程式,B 程式一樣無法手寫辨識。至此,都未解決問題。查看此 B 程式,發現其雖然沒有使用此手IME。但其使用的IME與此手寫IME的 DLL 名稱、DLL 中函數的名稱完全是一樣的。將 A 程式使用的此手寫 SDK 的動態庫 DLL 改名,再次進行測試發現 A 程式和 B 程式可以完美的共存。進行到這一步,問題已經解決,但對問題的根本原因(也就是解析)還不明白。問題的關鍵在於運行 B 程式後為何 A 程式動態載入 DLL 中的函數時,那個函數會載入失敗?兩個獨立的進程空間,為什麼會衝突?