全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1886
推到 Plurk!
推到 Facebook!

請問子函數有辦法知道是被那個父函數所呼叫嗎?

答題得分者是:Jasonwong
mypigbaby
高階會員


發表:11
回覆:168
積分:155
註冊:2006-07-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-03-24 16:42:28 IP:60.244.xxx.xxx 訂閱
請問大家 .
豬寶寶有寫一個函數 WRITEDATETOFILE('XXX'); 因為這個函數是屬於共用型的
所以不知道會由那個函數所呼叫,可是現在有需求 ,希望能在WRITEDATETOFILE中記錄是由那個函數或FORM所呼叫的,
豬寶寶查了半天..完全沒有頭緒,請問有人可以幫忙指導一下嗎?
謝謝
TWY
高階會員


發表:2
回覆:133
積分:152
註冊:2009-09-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-03-25 09:16:49 IP:59.120.xxx.xxx 訂閱
 您好,不確定有沒有誤解你的問題...
可以仿照 procedure TForm1.Button1Click(Sender:TObject); 這樣標準、常見的方式來撰寫,也就是利用 Sender。
假設想知道哪個 Form 的函式呼叫,引數多加一個 WriteDateToFile(refForm:TForm; .... ); 程式裡可以呼叫 refForm.Name 來取得 Form 的名稱,諸如此類作法。
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-03-25 15:28:16 IP:210.66.xxx.xxx 訂閱
您是要 DEBUG 用嗎 ??   我也遇到類似的困擾,
我以前的做法

AA(),BB(),CC() ....PROCEDURE 或 FUNCTION 要 呼叫共用函數 HH()

法1 : 直接傳入引數
AA--> HH( 'AA' ) , BB-->HH( 'BB') , CC-->( 'CC')

法2: 共用變數
var
sName : string;

-------
FUNCTION AA() OR PROCEDURE AA()
begin

sName := 'AA';

......
HH();
end;


FUNCTION HH() OR PROCEDURE HH()
begin

showmessage( sName );

end;

法 3 :
AA,BB,CC 的函數名稱自動取出(忘記那函數?? )..取代 法1,2 的給值方法



------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
編輯記錄
ANDY8C 重新編輯於 2010-03-25 15:32:40, 註解 無‧
ANDY8C 重新編輯於 2010-03-25 15:36:41, 註解 無‧
mypigbaby
高階會員


發表:11
回覆:168
積分:155
註冊:2006-07-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-03-25 16:12:52 IP:219.87.xxx.xxx 訂閱
豬寶寶就是要方法3 ^^"
因為豬寶寶有寫出一個函數給其他同事用
現在有需要記錄是由那個函數所呼叫
目前是希望在不修改 SOURCE CODE的前提下(只要重新COMPILE)
看出是由那支程式所呼叫

謝謝

===================引 用 ANDY8C 文 章===================
您是要 DEBUG 用嗎 ?? 我也遇到類似的困擾,
我以前的做法

法 3 :
AA,BB,CC的函數名稱自動取出(忘記那函數?? )..取代法1,2的給值方法



TWY
高階會員


發表:2
回覆:133
積分:152
註冊:2009-09-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-03-25 17:34:44 IP:59.120.xxx.xxx 訂閱
剛花了好些時間思考與網海爬文,站內約有幾篇類似文章,大家給的建議很多但都需要改到 Source。
我也很想知道 ANDY8C 方法 3 的 "那個函數" 是什麼 (我的理解是 只要那個函數寫在共用 procedure 就可判斷呼叫者是誰)。
就麻煩 ANDY8C 有空時能努力回想一下,提攜一下後進,感恩先~
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-03-25 18:09:59 IP:210.66.xxx.xxx 訂閱
TWY 前輩 您好:
我的方法還是要 改 SOURCE ,

例如 : 在 HH() 內加入該函數,

就可以知道 上一層是誰來呼叫 HH()

那神秘的函數,我會翻一下 早期 的程式,看能否找到.......

------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
TWY
高階會員


發表:2
回覆:133
積分:152
註冊:2009-09-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-03-26 09:18:13 IP:59.120.xxx.xxx 訂閱
前輩不敢當,時常有這樣感觸,對技術越學習越覺得自己的渺小與無知,或許就是古人所云「學,然後知不足」吧。
當然我們想要的就是那個神祕函數,只需要寫在被呼叫的那"一個"共用函數即可,上百個呼叫者是不用改的。
提供一個站上找到一樣問題的地方參考 http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=92658

===================引 用 ANDY8C 文 章===================
TWY 前輩 您好:
我的方法還是要 改 SOURCE ,
例如 : 在 HH() 內加入該函數,
就可以知道 上一層是誰來呼叫 HH()
那神秘的函數,我會翻一下 早期 的程式,看能否找到.......

Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-03-26 13:53:26 IP:210.202.xxx.xxx 未訂閱
http://edn.embarcadero.com/article/30115
希望這個網址能對你有幫助
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
mypigbaby
高階會員


發表:11
回覆:168
積分:155
註冊:2006-07-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-03-29 10:54:28 IP:60.244.xxx.xxx 訂閱
謝謝您的link
但是還是看不懂那個在寫什麼>"<

===================引 用 Jasonwong 文 章===================
http://edn.embarcadero.com/article/30115
希望這個網址能對你有幫助
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-03-29 11:28:45 IP:210.202.xxx.xxx 未訂閱
我大約查了一下, 你們所要的功能名稱叫做 procedure call stack

由 A procedure 去 call B procedure 的話, 因為 B procedure 執行完後必須跳回 A procedure

所以在流程上就必須記錄 A procedure 的一些必要資訊, 而這些資訊就是放在 stack 上

我找到的這個網址就是在實作這個技術

===================引 用 mypigbaby 文 章===================
謝謝您的link
但是還是看不懂那個在寫什麼>"<

===================引 用 Jasonwong 文 章===================
http://edn.embarcadero.com/article/30115
希望這個網址能對你有幫助
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-03-29 19:27:57 IP:140.135.xxx.xxx 訂閱
小弟的感覺

傳入 "參數" 的方法還是最單純

假設 HH() 函數是寫死在 DLL 中,無 SOURCE 可改

或許 多寫一個 "中間函數" MM()

AA('AA') 呼叫 MM( getVar ) ;
再由 MM() 去呼叫 HH() 一樣可以解
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2010-03-29 21:29:58 IP:220.135.xxx.xxx 訂閱

===================引 用 mypigbaby 文 章===================
目前是希望在不修改 SOURCE CODE的前提下(只要重新COMPILE)
看出是由那支程式所呼叫


如果前提是都不改caller,那麼也就表示該function的parameters是不能變動的。那麼我很肯定的說… 這是一個無解的題目!

我經常破解軟體,也就是說經常反組譯,就我的了解來說,這樣的條件最多僅可以找到是 哪個 指標(pointer)呼叫了它。其方法就是在stack上找到呼叫者的位址,詳情需要了解組合語言。但,就算找到了指標,你也只能統計出,從哪個位址呼叫函式的次數,但這似乎幫助不大。

我想,我們需要了解,當compiler後,所有的函式名其實都已無意義,通通會被轉成記憶體的位址,連os也不會去維護它(debug模式除外,還有dll中被import/export的函式也除外)。於是,除非自己刻意的在函式的caller的地方做手腳,在呼前寫入記錄,或把函式加入一個"記號 "的參數,由呼叫者傳入。這二種方法,Andy8c的都有提了。

所以,結論,雖然未能正面的解答你的問題,但告訴你不可能後,你便也可以不用花太多的時間走冤枉的路了!


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2010-03-29 21:31:08, 註解 無‧
aftcast 重新編輯於 2010-03-29 21:31:58, 註解 無‧
aftcast 重新編輯於 2010-03-30 09:39:51, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2010-03-30 15:35:06 IP:59.125.xxx.xxx 訂閱
難度頗高
1. 目前可以經由 stack 撈到呼叫點
2. 可以使用 RTTI 與 VCL 的記憶體配置方式的相關知識,撈到相關的配置區間,可能要進一步分析
3. 比對落在那個區間 An address between a function's start and ret point.
或許可行

如果是單純的函式 (not method),就必須自己建立文字與位址的表格,因為這些資訊,僅存在設計時期
如果設計時期不去處理,編譯後,都只剩下位址的關係


===================引 用 mypigbaby 文 章===================
目前是希望在不修改 SOURCE CODE的前提下(只要重新COMPILE)
看出是由那支程式所呼叫

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