如何取得一個 instance 內的function 的位址? |
答題得分者是:Coffee
|
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
|
carstyc
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
|
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
|
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
|
sryang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
function 的位址是寫在 class 裡面,而不是 instance 裡面
所以用 @TForm1.aaa 才能取到 ===================引 用 gerojeng 文 章=================== 例如 Tform1 = class(tform) public: function aaa :integer ; end; var fomr1 := tform1.create ; 我用 @(form1.aaa) 取不到 form1.aaa 的位址 該怎麼做才好呢 ?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
我沒有看到code,但猜想問題在於你使用的pointer是function pointer而不是method pointer。
Delphi提供object method的pointer prototype為 type AMethodPointer = function(AParameter : TMyParameterType): TResultType of object; 但是你要在dll裡面使用,我的建議就不會是讓外部直接使用這個method,原因是在於初始化dll時,該instance不一定已經被初始化完成,因為Delphi未直接提供static variable。 我的建議是,宣告一個global function讓外部作callback使用,然後在該unit的implementation宣告一個unit scope的class variable,再使用initialization跟finalization來確保在該unit被初始化時,該variable會被初始化,結束時被回收。這樣這個global method的implementation就可以取得該unit scope的variable充作static variable使用。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
但是, 用 @Class.method 取到的好像不是 instance 的位址吧
@TForm1.AAAAA 這會是TForm1哪一個instance的位址?不知道,這恐怕只能給static function 用了 我本來就是用 Coffee 兄的方法 只是想問有沒有更直接的做法可以直接取得一個 instance 內的 function 或者 method 的值 比如 Self.GetFunctionAddress("functiona") 取出當前instance任意一個function 的值 |
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
|
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm5 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure aaaa ; end; Taaa = procedure of object ; Paaa = ^Taaa ; var Form5: TForm5; implementation {$R *.dfm} procedure TForm5.aaaa; begin // ShowMessage('a'); end; procedure TForm5.btn1Click(Sender: TObject); var k1:Taaa; begin k1 := self.aaaa ; ShowMessage(IntToStr(integer(@k1))); // k1 ; end; end. 這樣就可以在 instance 內直接挖出該instance的aaaa 的Address了! |
gerojeng
一般會員 ![]() ![]() 發表:23 回覆:25 積分:9 註冊:2004-06-19 發送簡訊給我 |
|
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
這是我的作法:P
http://delphi.ktop.com.tw/board.php?cid=30&fid=70&tid=88676#3 另,就我的印象所及,C 沒有很方便的方法如同Delphi的method pointer,用一般的function pointer指向method pointer呼叫會有問題。 因此我不論在C 或是Delphi上面都是使用同樣的手法來達成調用instance method 下次請您將問題描述清楚,看其它前輩的回覆您應該看的出來大家都還在猜您問的是什麼。 另,關於C 使用方法的詢問建議至相關版面發文,並附上此文連結。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |