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

如何取得函式位址?

答題得分者是:pwipwi
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-15 15:47:42 IP:61.219.xxx.xxx 未訂閱
請問要如何取得Class的函式位址?
Class定義如下:
class A : public TForm
{
public:
    __fastcall A(TComponent *AOwner);
    bool __fastcall CheckValue(int Value);
};    取得函式位址
__fastcall A::A(TComponent *AOwner):TForm(AOwner)
{
int Address = (int)CheckValue;  <===編譯不會過?
ShowMessage(IntToHex(Address,8));
}    但是如果我將CheckValue這個函式不放在Class,改成如下:
class A : public TForm
{
public:
    __fastcall A(TComponent *AOwner);
};    bool __fastcall CheckValue(int Value);
這樣就可以順利編譯成功!    我要如何才能取得Class裡面函式的位址?因為我要將此位址傳給另一個類別來呼叫此函式!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-15 16:49:30 IP:203.73.xxx.xxx 未訂閱
引言: 請問要如何取得Class的函式位址?
Class定義如下:
class A : public TForm
{
public:
    __fastcall A(TComponent *AOwner);
    bool __fastcall CheckValue(int Value);
};    取得函式位址
__fastcall A::A(TComponent *AOwner):TForm(AOwner)
{
int Address = (int)CheckValue;  <===編譯不會過?
ShowMessage(IntToHex(Address,8));
}    但是如果我將CheckValue這個函式不放在Class,改成如下:
class A : public TForm
{
public:
    __fastcall A(TComponent *AOwner);
};    bool __fastcall CheckValue(int Value);
這樣就可以順利編譯成功!    我要如何才能取得Class裡面函式的位址?因為我要將此位址傳給另一個類別來呼叫此函式!
liangnet 你好: 先試試這樣子寫可不可以呢? < class="code"> ShowMessage(IntToHex((int)MethodAddress("CheckValue"), 8)); -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-15 17:26:22 IP:61.219.xxx.xxx 未訂閱
引言: liangnet 你好: 先試試這樣子寫可不可以呢? ShowMessage(IntToHex((int)MethodAddress("CheckValue"), 8));
RaynorPao 您好: 小弟剛試了一下,會回傳為0 !
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-15 18:43:25 IP:211.76.xxx.xxx 未訂閱
liangnet你好:     如果你是要處理Cplusplus class成員函數位置,個人建議不要傳給"不同型別的"class來呼叫。如果是同一種類的class,倒是可以。例子如下:  
 
class MyClass{
    public:            void F1(int){}
        void F2(float){}    };    void __fastcall TForm1::Button1Click(TObject *Sender)
{
void (MyClass::*AddressOfF1)(int) = MyClass::F1;
void (MyClass::*AddressOfF2)(float) = MyClass::F2;
MyClass object;
((object).*(AddressOfF1))(1);
((object).*(AddressOfF2))(1.2);
}
至於為何不同型別的class我不建議....這大概需要寫一篇文章來解釋了。也是可以做到的,只是你用的時候別說是我告訴你的。例子如下: < class="code"> class Foo { public: int Value; Foo(int Value_):Value(Value_){} int Bar(void) {return Value;} }; void main() { int (Foo::*pBar)(void) = &Foo::Bar; long address = *(long*)&pBar; int (*ptr)(Foo*) = *(int(*)(Foo*))address; Foo a(10),b(200); cout << (*ptr)(&a) << endl; // 10 cout << (*ptr)(&b) << endl; // 200 } 不過以上的方法有很多不適用的地方。比如在VCL用法完全不同,borland為了做到這個功能,還引進了__closure關鍵字。如果你是要在VCL中用像是event handler的功能,可以考慮用__closure就可以解決。用法如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
void __fastcall (__closure *AddressOfOnClick)(System::TObject* Sender) = Button1->OnClick;
AddressOfOnClick(Button2);
}
 
不過,還是有使用上要注意的地方,例如用closure呼叫時,和Cplusplus的member function是完全不同的,this指標不一定是指向正確的object。所以要用到成員變數,就要利用Sender指標(Sender指標就是要代替this用的)。其他的使用細節,如果有遇到問題再一起討論吧
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-15 19:31:32 IP:218.170.xxx.xxx 未訂閱
pwipwi 您好:    非常感謝你的回覆,你的回覆解決了我的問題!
系統時間:2024-05-19 5:58:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!