線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1927
推到 Plurk!
推到 Facebook!

Tool->Debug Options->...->Exception Type To Ignore如何用

答題得分者是:careychen
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-12 17:15:34 IP:219.81.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-12 18:16:04 IP:218.210.xxx.xxx 訂閱
你可以看一下,在彈出的錯誤視窗裡面會有類似 class Exxx 的地方,把 Class 後面的那個 Exx 填入就行了



不過~~~~這個方法也只有擋住在 Design 階段,不會跳出畫面去煩你而已,但實際在跑有錯還是會跳出來
建議你在呼叫他函式的地方加上 try Except 可能會比較穩定一點
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-09-12 18:20:30, 註解 無‧
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-14 16:30:19 IP:219.81.xxx.xxx 訂閱
Hi,
感謝CareyChen的指導
現才知, 這功能只有在Design時才有用, 我又學到了一樣了
如何才可在RunTime時不出現呢
Try Except 有用過, 但如出錯時, DLL後面的就不執行了, 所以該資料就無法如VC 一樣得到一個回覆值
可以用SendMessage之類, 測到有此MessageBox出現了, 再自動給一個Enter值嗎
對SendMessage不熟, 雖有爬文, 但一直未試功功

懇請指點



careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-14 19:43:58 IP:59.126.xxx.xxx 訂閱
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 出你的測試狀況,不過我初步測了一下,是可以達成的,祝您順利~~!
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-09-14 19:45:49, 註解 無‧
careychen 重新編輯於 2008-09-14 20:10:13, 註解 無‧
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-15 23:31:58 IP:219.81.xxx.xxx 訂閱
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;
...
是這樣嗎


懇請再指點

系統時間:2024-04-26 22:23:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!