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

如何引用在 DLL 裡面的 callback function ?

答題得分者是:cmf
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-17 17:01:22 IP:211.23.xxx.xxx 未訂閱
我用 VC 做了一個 .dll 的檔案,裡面有 callback function ,如下表示,我想拿到 Delphi 裡面引用,不知道在 Delphi 裡面要如何宣告,麻煩請大家指導一下,謝謝! extern "C" void (*OnDataAdd)(int A, int B);
FrederickPau
資深會員


發表:4
回覆:161
積分:268
註冊:2002-11-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-17 22:55:30 IP:61.228.xxx.xxx 未訂閱
VC 沒有很熟 ... 可能會錯喔 ...  但是還是給你做個參考 ...
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-18 10:08:52 IP:211.23.xxx.xxx 未訂閱
嗯!這樣的宣告我試過了,可是執行起來好像不是我想要的,嗯!我詳述一下好了: vc 的 .dll 宣告 : void (*OnDataAdd)(int A, int B); vc 的 .dll 使用 : if (OnDataAdd) OnDataAdd(3,5); vc 的 ap 宣告:在 InitInstance 裡面 OnDataAdd = HandleOnDataAdd; vc 的 ap 使用:void HandleOnDataAdd(int A, int B){..........} 那在 Delphi 裡面要怎麼使用呢?我看了很多的範例,使用像下面這種宣告時 < void (*OnDataAdd)(int A, int B); > 好像都會用另一個 function 來擺放這個 callback ,ex:void mycallfunc(OnDataAdd DataAdd......),是不是這樣才是正確的用法呢?我還有另外一個疑問,如果是 .dll 要 export 的變數,在 Delphi 裡面要怎麼定義呢?
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-18 10:19:21 IP:61.218.xxx.xxx 未訂閱
vc 的 .dll 宣告 : void (*OnDataAdd)(int A, int B); vc 的 .dll 使用 : if (OnDataAdd) OnDataAdd(3,5); vc 的 ap 宣告:在 InitInstance 裡面 OnDataAdd = HandleOnDataAdd; vc 的 ap 使用:void HandleOnDataAdd(int A, int B){..........} type TOnDataAdd=Procedure(a,b:integer); OnDataAdd:TOnDataAdd; OnDataAdd := HandleOnDataAdd; procedure HandleOnDataAdd(A,B:integer); begin .......... end; 發表人 - cmf 於 2003/02/18 10:20:39
------
︿︿
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-18 10:46:53 IP:211.23.xxx.xxx 未訂閱
引言: type TOnDataAdd=Procedure(a,b:integer); OnDataAdd:TOnDataAdd; <-請問這個要放在什麼地方呢? OnDataAdd := HandleOnDataAdd; <-這個是放在 Form 的 create 嗎? procedure HandleOnDataAdd(A,B:integer); begin .......... end; 有一段時間沒用 Delphi 了,現在要重新用,而且還是以前未曾接觸過的東西,先謝謝你的幫忙!^_^ 發表人 - cmf 於 2003/02/18 10:20:39
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-18 11:49:39 IP:61.218.xxx.xxx 未訂閱
etboite:    我沒使用過 VC DLL 所以 僅供參考    請在你的 DLL 新增一個函式 void SetOnDataAdd(DWORD functionAddress);    在 delphi 中 宣告    type TOnDataAdd=Procedure(a,b:integer);     procedure setOnDataAdd(DWORD functionAddress); cdecl; external 'xxx.dll';    Form 的 oncreate event 內 setOnDataAdd(DWORD(@HandleOnDataAdd));        
------
︿︿
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-02-19 16:46:34 IP:211.23.xxx.xxx 未訂閱
procedure HandleOnDataAdd(A: Word; B:Word); var a1:Integer; a2:Integer; begin a1 := A; a2 := B; showmessage('OnDataAdd=' IntToStr(A)); end; 我有試過了,可是為什麼我在 Form create 時去做: setOnDataAdd(@HandleOnDataAdd); 時,它就會去 showmessage ? 我只是去 init function ,並沒有叫它執行啊?另,我在另一個 function 時才去呼叫它,但它出來的值卻是錯的,這又是為什麼呢?
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-02-19 16:55:11 IP:61.218.xxx.xxx 未訂閱
etboite: 可以列出比較完整的程式嗎?
------
︿︿
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-02-20 11:19:07 IP:211.23.xxx.xxx 未訂閱
這是我在 VC DLL 檔的 .h 宣告: typedef void (__stdcall *OnDataAdd) (WORD A, WORD B); extern "C" { DLL_TEST_API void myExportProc (OnDataAdd DataAdd); DLL_TEST_API int fnDLL_TEST(void); } 下面是我在 Delphi AP 的程式: type OnDataAdd = procedure(a,b:Word); stdcall; function fnDLL_TEST(): Integer ; stdcall ; external 'xxx.dll' ; procedure myExportProc(DataAdd: OnDataAdd); stdcall; external 'xxx.dll' procedure HandleOnDataAdd(A: Word; B:Word); stdcall; var a1:Word; a2:Word; begin a1 := A; a2 := B; showmessage('OnDataAdd=' IntToStr(A)); end; ......Button1Click()..... begin myExportProc(HandleOnDataAdd); data := fnDLL_TEST(); showmessage('fnDLL=' IntToStr(data)); end; 以上的程式碼,目前跑起來是滿正常的,但是我比較大的疑問是:myExportProc(HandleOnDataAdd);上面這個做初始對應的動作,放在 Button1Click 裡面跑是正常 OK 的,但是如果我把它拿到 FormCreate 去做的時的,就會馬上去showmessage ,(此時我只是去做初始而以,為什麼它就會秀了呢?),而且,還會發生 access violation 的問題呢?
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-02-20 11:30:51 IP:61.218.xxx.xxx 未訂閱
請問 VC DLL 內的 function 何時會 呼叫 HandleOnDataAdd
------
︿︿
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-02-20 12:10:44 IP:211.23.xxx.xxx 未訂閱
當我 call fnDLL_TEST(void); 時,會觸發這個 callback 的事件,以下是我在 VC 的 .cpp 程式碼: OnDataAdd aaa; DLL_TEST_API void myExportProc (OnDataAdd DataAdd) { aaa = DataAdd; } DLL_TEST_API int fnDLL_TEST(void) { if (aaa) { aaa(4,6); return 20; } else return 40; }
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-02-20 12:28:17 IP:61.218.xxx.xxx 未訂閱
etboite:    你可以使用 單步執行去查看 f8    當游標停在 myExportProc 這一行時    切換到 debug windows  ( delphi Main Menu -> View -> debug window ->CPU    之後  按f7 你就可以看到 從你的程式呼叫 myExportProc 的內容    請自行查看是什麼原因照成的        
------
︿︿
etboite
一般會員


發表:10
回覆:17
積分:5
註冊:2003-02-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-02-21 15:42:50 IP:211.23.xxx.xxx 未訂閱
感謝 cmf 的回覆,總結這幾天的心得,最大的問題點還是卡在 stdcall 的轉換問題,目前,已經解決這個問題,謝謝!
系統時間:2024-05-13 9:25:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!