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

如何取得一個 instance 內的function 的位址?

答題得分者是:Coffee
gerojeng
一般會員


發表:23
回覆:25
積分:9
註冊:2004-06-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-26 21:34:04 IP:218.160.xxx.xxx 訂閱
例如
Tform1 = class(tform)
public:
function aaa : integer ;
end;

var
fomr1 := tform1.create ;

我用 @(form1.aaa) 取不到 form1.aaa 的位址
該怎麼做才好呢 ?

carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-26 22:08:15 IP:219.84.xxx.xxx 訂閱
請教一下,您取Function的位址要做啥?

===================引 用 gerojeng 文 章===================
例如
Tform1 = class(tform)
public:
function aaa :integer ;
end;

var
fomr1 := tform1.create ;

我用 @(form1.aaa) 取不到 form1.aaa 的位址
該怎麼做才好呢 ?

gerojeng
一般會員


發表:23
回覆:25
積分:9
註冊:2004-06-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-26 23:06:30 IP:218.160.xxx.xxx 訂閱
在  class 裡面傳一個 class 內的 function address 給外部 DLL做 call back function 
gerojeng
一般會員


發表:23
回覆:25
積分:9
註冊:2004-06-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-27 01:59:11 IP:218.160.xxx.xxx 訂閱
我初步的做法是把函數寫成 global 的 這樣就可以直接對韓術取 @
然後宣告一個 global pointer 指向我要的 class 的 instance
在那個global 函數內呼叫 global pointer 指向的物件方法解決

只是這樣好像不是很乾淨
有沒有辦法直接取出一個 instance 的成員函數的位址 ?
Var
a : tform1 ;

(@a.Method1) <-----為什麼不能這樣取呢 @@
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-05-02 12:54:02 IP:124.10.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-05-02 23:35:26 IP:114.43.xxx.xxx 訂閱
我沒有看到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使用。

------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2010-05-02 23:36:52, 註解 無‧
Coffee 重新編輯於 2010-05-02 23:40:37, 註解 無‧
Coffee 重新編輯於 2010-05-02 23:41:22, 註解 無‧
gerojeng
一般會員


發表:23
回覆:25
積分:9
註冊:2004-06-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-05-08 14:55:42 IP:218.160.xxx.xxx 訂閱
但是, 用 @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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-05-08 15:01:03 IP:218.160.xxx.xxx 訂閱
http://www.programmersheaven.com/mb/delphikylix/245467/245467/pointer-to-function/

在這一篇我找到我要的東西了

gerojeng
一般會員


發表:23
回覆:25
積分:9
註冊:2004-06-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-05-08 15:06:47 IP:218.160.xxx.xxx 訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-05-08 15:08:45 IP:218.160.xxx.xxx 訂閱
不知道同樣的事情用 C++ 要怎樣寫
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-05-09 11:01:04 IP:114.43.xxx.xxx 訂閱
這是我的作法: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 使用方法的詢問建議至相關版面發文,並附上此文連結。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
系統時間:2024-04-20 7:48:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!