Tool->Debug Options->...->Exception Type To Ignore如何用 |
答題得分者是:careychen
|
frog1
一般會員 發表:25 回覆:40 積分:18 註冊:2007-01-24 發送簡訊給我 |
Hi,各位前輩
用Delphi7調用VC 的DLL, 會出現 Invalid floating point operation 的錯誤訊息, 但程式還是持續執行, 只是有MessageBox要用手點掉, 與原DLL提供者連絡, 說是Delphi與VC 編輯器的差異, 需自己處理, 我想就令MessageBox不出現 找到Tool->Debug Options->Language Exception->Exception Type To Ignore, 好像可以設定忽略這訊息, 看了Help 其中有一段 You can add more exceptions to the list box by clicking Add and typing the name of the exception. Added exceptions will include a check box that lets you check the items you want to ignore and uncheck items you want the debugger to stop on. 不知 Added exceptions will include a check box 中的Check Box要如何設 也請前輩們指點, 用這種方式可以達到目的嗎?如可以, Check Box要在何處設?如何設?或有其他的方式可成到要的目的? 謝 |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
frog1
一般會員 發表:25 回覆:40 積分:18 註冊:2007-01-24 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
HI, 如果是這樣,那我有幾個想法,你試試,雖然我還沒試的很完整~~,但我覺得這樣應該可行
第一、 要攔截 MessageBox 可以使用 Skyer 前輩發表的 sHookApi Library - for Delphi (監測 API 函式組) (源碼 圖解) 來達成攔截的目的,但因為一旦攔截,則【本程式的 MessageBox 全部攔截】,所以我們還需要第二、三步 第二、 抓出 Dll 的 Handle ,不過相信這個你應該本來就有抓到了 第三、 有了第二點之後,在 Skyer 前輩的 Sample 中有寫了兩個回呼的函式叫 OrigMsg1、OrigMsg2 你其實只要一個就行 所以,你要在攔截到 MessageBox 的出現後,在 OrigMsg1 裡用 GetParent(HWND) 來取出呼叫此 MessageBox 的 是由 DLL 所引發的還是你自已的程式本身引發的,用第二步的 Handle 去比對即可,如果此 MessageBox 是 DLL ,那麼你就要取消 MessageBox 的運作,如果不是,當然就 ByPass 讓你自己的程式彈出應該彈的視窗 最後 Skyer 前輩在程式的源碼中有載明 如下的片斷,請記得跟他說一聲唷~~~! [code delphi] // 如果您的程式 or 商品有使用或參考本 lib 的話,煩請跟我說一聲 // 讓我高興一下 ^Q^ // // 可至 Delphi.KTop 發短訊 or 寫 email 給 Skyer // // 本 lib 使用了 (c) sars [HI-TECH] 2003 [sars@ukrtop.com] 的 // Catchy32 v1.6 - Length Disassembler Engine 32bit [/code] 您先試試,如不行的話,再 po 出你的測試狀況,不過我初步測了一下,是可以達成的,祝您順利~~!
------
價值的展現,來自於你用哪一個角度來看待它!! |
frog1
一般會員 發表:25 回覆:40 積分:18 註冊:2007-01-24 發送簡訊給我 |
Hi
感謝CareyChen耐心的指導, 但容許個人的笨拙, 看了半天, 試了一下, 還是不會 DLL的Handle, 我知可用LoadLibary來取得 有DownLoad Skyer 前輩發表的 sHookApi Library - for Delphi, 但不知 Handle : THandle MessageBox(0, nil, nil, 0); sUnhookApi(@OrigMsg1); 要放那, 在CreateForm就設他, 還是調用DLL前還是... 另在 OrigMsg1 裡用 GetParent(HWND) 來取出呼叫此 MessageBox 的是由 DLL 所引發的還是你自已的程式本身引發的 function sHookApi(dll, api: string; callbackFunc: Pointer; Handle : THandle): Pointer; (Handle為Dll的 Handle) var ... begin Result := nil; If Handle <> GetParent(HWND) Then Exit; hlib := GetModuleHandle(PChar(dll)); if hlib = 0 then Exit; ... 是這樣嗎 懇請再指點 謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |