win32中的dll是和调用进程同一个地址空间吗?好象常看到的dll资料都是win16的。:<
解决方案 »
- Operation not allowed on a unidirectional dataset错误?
- 怎么把ASPHTTP.DLL生成ASPHTTP_TLB.pass文件?
- 公式编辑器编辑的公式可以放到delphi的控件上吗
- Delphi书籍资料下载
- 这个是什么错误?如何解决?
- Rave报表中的页码如何实现?
- 在public下面和在implementation上面定义的变量有什么区别?
- 求教ehlib6.3中TDBGrideh控件的一个问题
- 关于线程模式选择的问题???请教各位,请跟我来哦
- parameters.parambyname('date0').value:=pick1.datetime;有錯?
- 关于combobox自画问题。
- 一个非常有新意的想法,求其设计思路,有兴趣者请进
但是在Win32里dll是和调用进程肯定是同一个地址空间
还有,hwnd类型不可以为-1?他是Dword类型的吧?无符号整数。用-1会出现问题。
uses
windows, messages, dialogs;//我喜欢用showmessage来测试
var
hookhandler:hhook;
ah:hwnd;//ah 是dll中的全程变量
这是钩子函数:
function hookhandler(iCode:integer;wParam,lParam:longint):longint;stdcall;
begin
if iCode <0 then
hookhandler:=callnexthookex(hkhnadle,icode,wparam,lparam);if iCode \>=0 then
if PCWPSTRUCT(lParam)^.message=WM_CREATE then
if PCREATESTRUCT(CWPSTRUCT(lParam)^.lparam)^.lpszName='test1' then
begin
ah:=CWPSTRUCT(lParam)^.hwnd;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 这里的ah当然是个在这个dll中定义的hwnd类型,我测试过,在这里得到了
//窗口的句柄。
//但是,但是好象不能正确的传递出dll。为什么?
// 该如何做?
我的程序不是很复杂,除了在这里被赋值外,别的地方只是读.不信你自己可以试试,比如:
showmessage(inttostr(ah));你可以看到得到的hwnd的值,然后,在主程序(就是调用这个dll的程序)中用showmessage(inttostr(findwindow(nil,'test1'))),两个值绝对是一样的.
好了,在这个dll中另一个函数取这个dll中的全程变量ah.见function gethandle. ·
·
·end; function gethandle:hwnd;stdcall;
begin
if ah<>0 then result:=ah
else result:=-1; //这个函数总是得到结果-1,是什么问题?
(其实hwnd这么赋值没什么问题的。系统会把它解释成一个很大的数....)
在主程序中,我们发现ah根本就没有返回先前得到的hwnd,事实上,ah的值是0!end;//后面的程序就没打了 。
var
hookhandler:hhook;
~~~~~~~~~
这个应该是hkhadle:hhook;
ah:hwnd;//ah 是dll中的全程变量
win32中的dll是没有自己的数据区的!在win3.x时代,可以通过dll中的数据来几个程序共享变量。因为win32的这个限制,这里的问题出得就非常的轻率,也是非常的为初接触的人犯.:((
我们知道,win32在调用到dll时,dll要被映射到调用程序的地址空间.而win32各个程序之间是完全独立的,彼此很难越过边界访问对方.钩子函数是什么时候被调用到的呢?它根本就不是你的程序调用的!(不是吗?你的程序中哪里有调用的痕迹?)事实上,钩子函数这个回调函数是被你所要截获的程序调用的.道理至此,我们知道为什么出了那个问题了。那个ah在你调用的那个主程序中确实是没得到hwnd.得到的数值在进程test1.exe的地址空间中。
还好,我问了一个同学,最终用文件影象(file-mapping)解决了这个内存共享的问题。下次有功夫把它给贴出来。ps:回头搜索了一下以往的技术文章,讲到file-mapping的早有了。自己没注意罢了.嘿嘿.