模型如下:.exe       //用户UI
------------ 
.exe       //中间层,判断一些状态信息
------------
.DLL       //底层DLL中间层先获得DLL的句柄,然后进行一些状态判断,如果正常,启动上层UI。
现在的疑问是上层UI同样需要这个句柄,我是这么想的。在DLL中定义个返回DLL文件句柄的函数,中间层和上层UI都可以访问,只是时间上的差异。
中间层访问后,正常便启动上层UI,然后UI同样方法取得句柄,操作。小弟的疑问:不同的进程获得同一DLL文件的句柄,在内存中是怎么存储的,是否会造成一些想不到的结果(本人认为句柄是一个地址,所以应该不会出现什么问题吧,请指点)
还有我查阅了其他的方法,想给DLL开辟个共享区、不同进程通过消息传递信息。不知还有什么方法,它们实现起来的难易忘大侠多多指教!

解决方案 »

  1.   

    利用DLL开辟共享区应该是不可行的,因为不同的进程分配的是不同的内存段。可以通过共享内存来实现。
      

  2.   

    to xpdavis(咕嘟) :那我的这种方式呢?可不可行?
      

  3.   

    to flyelf(空谷清音) :与UI无关!
      

  4.   

    用dll共享数据这个没问题,dll中可以通过预处理命令生成dll的全局数据区,其数据被每个加载此dll的exe所共享,但是共享dll句柄是没有意义的,因为dll的句柄就是其在exe加载的内存偏移量,但是,对于每个exe来说,加在同一个dll的内存偏移量是不同的(事实上基本相同,但无法承诺会相同)。
      

  5.   

    多进程利用共享内存DLL共享数据共享数据DLL允许进程以类似于Windows 3.1 DLL共享数据的方式访问读写数据,多个进程都可以对该共享数据DLL进行数据操作,达到共享数据的目的。在WIN32中为建立共享内存,必须执行以下步骤:
    首先创建一个有名的数据区。这在Visual C++中是使用data_seg pragma宏。使用data_seg pragma宏必须注意数据的初始化:
    #pragma data_seg("MYSEC")
    char MySharedData[4096]={0};
    #pragma data_seg()
    然后在用户的DEF文件中为有名的数据区设定共享属性。
    LIBRARY TEST
    DATA READ WRITE
    SECTIONS
    .MYSEC READ WRITE SHARED这样每个附属于DLL的进程都将接受到属于自己的数据拷贝,一个进程的数据变化并不会反映到其他进程的数据中。在DEF文件中适当地输出数据。以下的DEF文件项说明了如何以常数变量的形式输出MySharedData。
    EXPORTS
    MySharedData CONSTANT
    最后在应用程序(进程)按外部变量引用共享数据。
    extern _export"C"{char * MySharedData[];}
    进程中使用该变量应注意间接引用。
    m_pStatic=(CEdit*)GetDlgItem(IDC_SHARED);
    m_pStatic->GetLine(0,*MySharedData,80);
      

  6.   

    共享段我也做了,现在重新说一遍,另一个问题exe1    exe2
    -------------    
        DLLexe1先loadlibrary,调用dll中的一个函数,这个函数处理后会返回一个句柄,这个句柄就存在dll的共享段中
    然后exe2 loadlibrary,调用另一个函数,这个函数会返回这个句柄。结果是exe2可以得到这个句柄的值,这些都没有问题,错误是无法使用这个句柄做操作,exe2中需要这个句柄进行处理百思不解,高手指点
      

  7.   

    ---------------------------------
    to  qizi0wang() :
    ---------------------------------
    你的回答就是我遇到的问题,不过怎么去传句柄呢????
    高手指点
      

  8.   

    ---------------------------------
    to  qizi0wang() :
    ---------------------------------
    以前用句柄只知道它是一个地址,完全没有想象是一个偏移量。而且我要得到的句柄不是dll的句柄,而是exe1调用dll的函数后返回的句柄,那么这个句柄是否与exe1有直接联系,它是否也是偏移量?
    为什么句柄是偏移量呢?指点一二
      

  9.   

    句柄本身只是一个32位值,不同的句柄有不同的含义,HBRUSH 、HINSTANCE、HRESULT 都是句柄,但其含义大相径庭,但一般情况下句柄都是标识某对象的(HRESULT就不是),所以一般的句柄是内存空间相关的,而不同的exe其内存空间是无关的,所以共享句柄的值是无意义的,如果你想共享的是内核对象句柄,可以参照《windows核心编程》里的几种跨越进程边界共享内核对象的方法,如果不是,你最好找到句柄对应对象的对你有意义的值,考虑复制对象的办法,总之最好能说出你到底需要共享什么句柄,否则我帮不了你的。
      

  10.   

    需要共享的是一个代表com口的句柄
      

  11.   

    你要共享的是某个com组件的一个实例的一个接口对吗?
    那就很复杂了,如果com是你自己写的那就需要依赖com的实现了。
    按理说不应该产生这样的需求的,我觉得还是软件设计的问题,除非你是在用你自己的软件集成很多其他的软件,如果可以改设计实现的话,最好改成进程内吧。否则你的com在另一进程内根本无意义就算获得了它的接口也是没有意义的啊!
      

  12.   

    com口的句柄为什么要共享,不同进程使用com口本来就需要互斥使用,你共享这个句柄有什么意义?
      

  13.   

    做的是两个程序,也就是在启动主程序之前,要运行一个安全检查程序,这个程序负责检查com口状态和一些设备的连接情况,条件满足,它会正常启动主程序,然后将得到的com口句柄传给主程序。软件的设计的确出现了问题,而且现在我们采取了保守策略,就是当安全检查程序运行后释放掉com口句柄,然后主程序再次获得来解决问题。
    不过既然遇到了这样的情况,我就像应该能够解决这个问题,有一个函数DuplicateHandle,不知大家是否听过?也不知它能不能处理好这个问题
    我只想和大家讨论一下这种情况的解决方法,谢谢大家参与。而且handle为什么不能在不同进程中传递使用,上面有朋友也提到了,就是handle的生成与这个.exe的调用有直接关系,handle其实就是在这个.exe文件内存区的一个偏移量,它只在这个进程中有效。虽然有共享数据区可以在不同进程见传递值,但handle的值传递起来就没有什么作用,因为它只是一个偏移量,离开这个exe的环境就没有作用了