紧急(200分)

  • 主题发起人 主题发起人 xyf2001721
  • 开始时间 开始时间
X

xyf2001721

Unregistered / Unconfirmed
GUEST, unregistred user!
如何使用CallBack?
 
把你的函数地址传给它。
 
to NoSwing
; ;举例说明之!?
 
一般来说都是我们编程调用系统功能,比如 Win32API
如果反过来,让系统调用我们的函数,就是CALLBACK了。
 
比如说在标准WINDOWS程序中窗口的消息处理函数就一般为回调函数.
(生成windows createwindow(或createwindowex)要求一个WNDCLASS类指针,wndclass中的lpfnWndProc就要求一个回调函数.

LRESULT CALLBACK CTest::WndProc(HWND hWnd,UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch (uiMsg)
{
; ; ; ; ; ; ; ; ; ; ;//消息处理
}
return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}

STDMETHODIMP CTest::CreateViewWindow(LPSHELLVIEW pPrevView,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;LPCFOLDERSETTINGS lpfs,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;LPSHELLBROWSER psb,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;LPRECT prcView,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;HWND *phWnd)
{
WNDCLASS wc = { 0 };

*phWnd = NULL;

// Register the class once
if(!GetClassInfo(g_hInstance, NAMESPACEVIEW_CLASS, &wc))
{
wc.style ; ; ; ; ;= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc ; ;= (WNDPROC) nameSpaceWndProc;
wc.cbClsExtra ; ; = NULL;
wc.cbWndExtra ; ; = NULL;
wc.hInstance ; ; ;= g_hInstance;
wc.hIcon ; ; ; ; ;= NULL;
wc.hCursor ; ; ; ;= LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground ;= (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName ; = NULL;
wc.lpszClassName ;= NAMESPACEVIEW_CLASS;

if (RegisterClass(&wc) == 0)
{
return E_FAIL;
}
}

// Store the browser pointer
*phWnd = CreateWindowEx(0, NAMESPACEVIEW_CLASS,NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
prcView->left, prcView->top,
prcView->right - prcView->left,
prcView->bottom - prcView->top,
m_hWndParent,
NULL,
g_hInstance,
(LPVOID) this);
if(NULL == *phWnd)
{
return E_FAIL;
}
return S_OK;
}
 
1、系统要求提供“回调”的函数在参数里都会有一项要求填入“回调函数”的地址,在这里
填入你的callback function的地址就可以了。如:
一个api声明如下:function AnApi(other parameters; CallbackAddr: pchar)...
而你打算提供的回调函数是:function myCallback(parameters)...
则使用回调应该:
...
AnApi(other parameters; @myCallback);
...
myCallBack由你自己实现,系统将在一定“条件”下调用它,这个“条件”会在sdk的api
说明中给出。
有时候CallbackAddr不一定是pchar型的(比如dword型),做相应类型转换即可。

2、如果你想让别人向你的程序提供回调函数供你调用,则你可以在你编的dll中提供一个
接受回调函数地址的函数:
function GetCallback(other parameters; CallbackAddr: pchar)...
并在这个函数中保存CallbackAddr以便适当的时候调用它。
 
做个广告,看一下,这是我写的第一个也是唯一一个设计回掉的例子。
显示密码的小程序。希望对你有用。
http://delphi.mychangshu.com/dispdoc.asp?id=430
 
http://www.csdn.net/Develop/Read_Article.asp?Id=6535
 
后退
顶部