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

CallWindowProc的問題

答題得分者是:windblown
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-06 16:58:14 IP:218.164.xxx.xxx 訂閱
主要的目的是要寫一個 global hook, DLL
使用 CallWindowProc( ) 時
我遇到的問題是會出現以下的錯誤:

[C Error] Unit1.cpp(41): E2034 Cannot convert 'long (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
[C Error] Unit1.cpp(41): E2342 Type mismatch in parameter 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(void *,unsigned int,unsigned int,long)')

程式碼如下:
<textarea class="cpp" rows="10" cols="60" name="code">#include #include #pragma hdrstop #pragma argsused HWND hSASWnd; WNDPROC OldSASProc; LRESULT CALLBACK SASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_HOTKEY) { // Ctrl Alt Del if (lParam == MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE)) return 1; } return CallWindowProc(OldSASProc, hWnd, uMsg, wParam, lParam); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { switch(fwdreason) { case DLL_PROCESS_ATTACH: hSASWnd = FindWindow(TEXT("SAS Window class"), TEXT("SAS window")); if(hSASWnd) OldSASProc = (WNDPROC)SetWindowLong(hSASWnd, GWL_WNDPROC, (LONG)SASWindowProc); break; case DLL_PROCESS_DETACH: if(hSASWnd) SetWindowLong(hSASWnd, GWL_WNDPROC, (LONG)OldSASProc); break; } return 1; } </textarea>
感謝前輩的指教!
------
=.=???
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-07 18:31:21 IP:211.21.xxx.xxx 訂閱
我猜你是用 bcb5, 試試看下面的方法行不行? 如果不行的話,要自己用個 function pointer

typedef int (__stdcall *MYPROC)();

把 FARPROC 改成 MYPROC


return CallWindowProc((FARPROC)OldSASProc
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-08 16:42:41 IP:218.164.xxx.xxx 訂閱
前輩您好,我用的是bds2006,
採用了你的方法後便可以,
不過還不太清楚這樣的做法與FARPROC的觀念為何?
===================引 用 文 章===================
我猜你是用 bcb5, 試試看下面的方法行不行? 如果不行的話,要自己用個 function pointer

typedef int (__stdcall *MYPROC)();

把 FARPROC 改成 MYPROC


return CallWindowProc((FARPROC)OldSASProc
------
=.=???
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-12 17:29:35 IP:59.124.xxx.xxx 訂閱
FARPROC 就類似 MYPROC, 只不過這是 Borland 維護的,但是,在 bcb5 時的定義為  typedef int (__stdcall *FARPROC)(HWND, UINT, WPARAM, LPARAM);

bcb6 時的定義為 typedef int (__stdcall *FARPROC)();

CallWindowProc() 的第一個參數需要的是 typedef int (__stdcall *FARPROC)();
因此, 在 bcb5 會有問題,而 bcb6 不會,想不到 bds2006 又發生類似 bcb5 的狀況,因此解決方法就是「強制轉型」成需要的型別

其實,從你 post 的錯誤訊息就可以看出,這個問題就是型別不同,而解決方法就是找到正確的型別而已 ^_^

===================引 用 文 章===================
前輩您好,我用的是bds2006,
採用了你的方法後便可以,
不過還不太清楚這樣的做法與FARPROC的觀念為何?
===================引 用 文 章===================
我猜你是用 bcb5, 試試看下面的方法行不行? 如果不行的話,要自己用個 function pointer

typedef int (__stdcall *MYPROC)();

把 FARPROC 改成 MYPROC


return CallWindowProc((FARPROC)OldSASProc
系統時間:2024-04-26 6:17:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!