如何引用在 DLL 裡面的 callback function ? |
答題得分者是:cmf
|
etboite
一般會員 發表:10 回覆:17 積分:5 註冊:2003-02-17 發送簡訊給我 |
|
FrederickPau
資深會員 發表:4 回覆:161 積分:268 註冊:2002-11-04 發送簡訊給我 |
|
etboite
一般會員 發表:10 回覆:17 積分:5 註冊:2003-02-17 發送簡訊給我 |
嗯!這樣的宣告我試過了,可是執行起來好像不是我想要的,嗯!我詳述一下好了:
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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
etboite
一般會員 發表:10 回覆:17 積分:5 註冊:2003-02-17 發送簡訊給我 |
這是我在 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 發送簡訊給我 |
|
etboite
一般會員 發表:10 回覆:17 積分:5 註冊:2003-02-17 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
etboite
一般會員 發表:10 回覆:17 積分:5 註冊:2003-02-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |