win32中的dll是和调用进程同一个地址空间吗?好象常看到的dll资料都是win16的。:<

解决方案 »

  1.   

    你的为什么不行我不知道,
    但是在Win32里dll是和调用进程肯定是同一个地址空间
      

  2.   

    不可能,ah在那里有值,在后面没有值?一定是你的程序在某个地方把ah的值弄丢了。
    还有,hwnd类型不可以为-1?他是Dword类型的吧?无符号整数。用-1会出现问题。
      

  3.   

    呵呵,这个问题总的说起来很有意思。(能在一个外部程序(比如,sol.exe)开始运行的时候得到通知)。library cmphk;  
    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;//后面的程序就没打了 。
      

  4.   

    呀,打错了。
    var 
    hookhandler:hhook;
    ~~~~~~~~~
    这个应该是hkhadle:hhook;
     ah:hwnd;//ah 是dll中的全程变量
      

  5.   

    仔细看了书之后,我确信,问题是我自己没认真思考.
    win32中的dll是没有自己的数据区的!在win3.x时代,可以通过dll中的数据来几个程序共享变量。因为win32的这个限制,这里的问题出得就非常的轻率,也是非常的为初接触的人犯.:((
    我们知道,win32在调用到dll时,dll要被映射到调用程序的地址空间.而win32各个程序之间是完全独立的,彼此很难越过边界访问对方.钩子函数是什么时候被调用到的呢?它根本就不是你的程序调用的!(不是吗?你的程序中哪里有调用的痕迹?)事实上,钩子函数这个回调函数是被你所要截获的程序调用的.道理至此,我们知道为什么出了那个问题了。那个ah在你调用的那个主程序中确实是没得到hwnd.得到的数值在进程test1.exe的地址空间中。
    还好,我问了一个同学,最终用文件影象(file-mapping)解决了这个内存共享的问题。下次有功夫把它给贴出来。ps:回头搜索了一下以往的技术文章,讲到file-mapping的早有了。自己没注意罢了.嘿嘿.
      

  6.   

    再加一句,在win32的hlp中看到(delphi附带的),WH_CALLWNDPROC钩子中得到的信息真的是只读的。
      

  7.   

    呵呵,昨天我还作了一个DLL数据共享的。:),的确,在Win32下,DLL虽然在内存只有一个Copy,当时没一个调用的程序都会被单独映射,所以数据并不是同一个,用文件映射的原理就是取得数据的指针,这个指针总是指向那个内存Copy的区域?而不是映射的区域,所以能够共享?