请教关于DLL的几个问题,谢谢了!(100分)

  • 主题发起人 主题发起人 zxdcj
  • 开始时间 开始时间
Z

zxdcj

Unregistered / Unconfirmed
GUEST, unregistred user!
因为小弟的键盘前几天烧到了刚换了个,所以攒下了几个问题,迫切需要大家的帮助.<br>1:StdCall为何物,是什么意思?<br>2:回调函数是怎么回事,是不是DLL调用这个函数,然后再返回结果给过程,就相当于拐了一个弯?<br>3:如何让DLL调用回调函数,也就是说DLL是怎么调用这个回调函数的,望给解释一下.<br>4:<br>type<br>&nbsp; TWindowInfo=class<br>&nbsp; &nbsp; WindowName,<br>&nbsp; &nbsp; WindowClass:string;<br>&nbsp; end;<br>………………<br>//这就是那个回调函数,代码我明白,就是不知道它和DLL之间是如何配合的<br>function EnumWindowsProc(Hw:HWnd;AMainForm:TMainForm):boolean;stdcall;<br>var<br>&nbsp; WinName,CName:array[0..144]of char;<br>&nbsp; WindowInfo:TWindowInfo;<br>begin<br>&nbsp; Result:=True;<br>&nbsp; GetWindowText(Hw,WinName,144);<br>&nbsp; GetClassName(Hw,CName,144);<br>&nbsp; WindowInfo:=TWindowInfo.create;<br>&nbsp; with Windowinfo do<br>&nbsp; begin<br>&nbsp; &nbsp; setLength(windowName,strlen(winName));<br>&nbsp; &nbsp; setLength(WindowClass,strlen(CName));<br>&nbsp; &nbsp; windowName:=winName;<br>&nbsp; &nbsp; WindowClass:=strPas(CName);<br>&nbsp; end;<br>&nbsp; //lbWinInfo是TListBox<br>&nbsp; MainForm.lbWinInfo.Items.AddObject('',WindowInfo);<br>end;<br>………………<br>procedure TMainForm.btnGetWinInfoClick(Sender: TObject);<br>begin<br>&nbsp; EnumWindows(@EnumWindowsProc,0);//使用回调函数,但这里是怎么回事, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //EnumWindowsProc怎么没有参数啊? <br>end;<br><br>问题很多,会占用大家很多宝贵时间,但大家不要不管我啊,我只有像大家那么厉害了才能帮别人啊,谢谢大家了!<br>
 
1:StdCall为何物,是什么意思?<br>是一種调用模式, 共有五种调用模式:register、cdecl、pascal、stdcall和safecall。根据调用模式的不同,参数可以通过CPU的寄存器或堆栈传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆栈来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和safecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆栈中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆栈中的参数。<br>
 
2:回调函数是怎么回事,是不是DLL调用这个函数,然后再返回结果给过程,就相当于拐了一个弯?<br>就是提供個函數地址給調用的函數, 讓它可以在需要的時候調用, 通知你!
 
===&gt;就是提供個函數地址給調用的函數, 讓它可以在需要的時候調用, 通知你! <br>噢,那么如此说来的话,使用回调函数的时候就只是将这个函数的地址通知DLL,至于什么时候用,是DLL说的算,怎么用是这个函数说了算吗?这样也就不需要传递参数了(多此一举?),是吗?我可以这样理解吗?我刚学不久,语言不专业,老师勿怪好吗?那么老师再给看看这个问题吧:<br>如何让DLL调用回调函数,也就是说DLL是怎么调用这个回调函数的,多谢老师!!!<br>
 
使用回调函数的时候就只是将这个函数的地址通知DLL,至于什么时候用,是DLL说的算,怎么用是这个函数说了算吗?<br>我覺得可以這樣理解!<br><br>&gt;&gt;这样也就不需要传递参数了(多此一举?),是吗?<br>回調函數也只是一種函數而已, 所以, 就象你調用函數一樣啊, 要照調定的來調用啊, 如果要求還參數, 你就必須正确的傳入參數啊!
 
Aiirii大哥,我有点明白了,回调函数需要某个值来确定执行操作时,就得通过这个DLL调用时带上相应的参数,是吗,不知我是不是理解错了?<br>那么这时怎么传参数呢?这个时候是传函数地址还是嵌套着传参数地址啊,还是传带着参数的函数的地址呢?<br>这个地方我真的不会,大哥帮忙啊!<br>我的脑子有点笨,大哥不要见笑!
 
回调函数的作用是让你在DLL函数的运行中能加入一些你想要的处理,比如你举的例子,EnumWindows(@EnumWindowsProc,0);为什么没有参数是应为Eunmwindow这个函数的第一个差数是个地址(也就是回调函数的地址);
 
实际上 在DLL中 一定定义了一个<br>Type Tdllfun= function (Hw:HWnd;AMainForm:TMainForm):boolean;stdcall<br>然后在 <br>Enumwindows 中有<br>var<br>dllfun:Tdllfun;<br>begin<br>.....<br>@dllfun:=第一个参数名<br>.....<br>end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1530826<br>什么是回调函数,最好有例子!
 
各位大哥接分<br>非常感谢各位的热心帮助<br>OK,THANKS,BYE!
 
后退
顶部