1。如果我的dll中引用了某个单元a.pas,再a.pas里面的initielization和finalization部分是什么时候被调用?是这个dll第一次装进内存和引用计数=0的时候调用?还是每当由应用程序调用这个dll和引用计数-1的时候发生?///////////////////2。在a.pas有个全局变量,这个变量是否能被调用这个dll的应用程序访问?
  如果能,怎么访问?
  如果一个进程修改了它,是否会影响到映射到其他进程的同名变量?

解决方案 »

  1.   

    这个问题有意思,
    1.是每当由应用程序调用这个dll和引用计数-1的时候发生
    2.不能
    ---------
    我不能确定上面的回答!
      

  2.   

    如果是显式调用,那么使用LoadLibrary这个windows API函数使计数器加一,当你使用完了这个DLL后,再调用windows API函数 FreeLibrary进行卸载,这将导致计数器减一,回到原来的状态。至于你说的全局变量能否被调用DLL的应用程序访问,这个在下还没有碰到过,DLL一般输出的例程(函数和过程);还得请高手来解决。
      

  3.   

    1,initielization  dll被调用的时候
    finalization   dll被释放的时候

    2。 win98是所有的应用程序共享一个dll的。所以a.pas会影响
        win2000是所有的程序都有一个dll的副本,所以a.pas不会影响如果要在 win2000下面创建一个进程间共享的变量,需要用到文件影射。
    自己试试看把
      

  4.   

    1。initielization 内的程序是在该单元内所有程序执行前所执行;
    2。finalization 内的程序是在该单元内所有程序执行后所执行;
       所以 initielization 一般是一些重要的初始化,而finalization 就是用来释放一些程序结束还没被释放的内存,//第一个问题第二个问题:
       如果你不用文件映射,理论上应该可以建一个过程来传递那个变量,
    把该过程放在接口部分就可以啦,试试吧!
      

  5.   

    第一个问题参看上面提示
    第二个问题可以试着用Build with package解决.
    我经常这样干
      

  6.   

    i'm still confused:对于第一个问题,
    到底是dll只有第一次被加载的时候执行initialazation还是每次有loadlibrary的时候也就是引用计数+1的时候都执行?
      

  7.   

    想用应用计数,应该使用接管DLlMain干吗使用initialazation
      

  8.   

    如果用了dllmain那么正好涉及到了我的第二个问题:如果在每次引用计数+1的时候执行某些操作,比如设置一个单元局部变量或者一个dll内全局变量+1,会不会影响到别的调用这个dll的进程内的相应变量?是不是就象 zsy_good(只要坚定不移的走下去,那一定会成功) 说的一样98会影响,2000不影响?
      

  9.   

    1.不同的进程共享DLL的代码,但是DLL内的数据区则是各进程独立的From Alexs(木头):
    2.第二个问题:
       如果你不用文件映射,理论上应该可以建一个过程来传递那个变量,
    把该过程放在接口部分就可以啦,试试吧!
      

  10.   

    zsy_good和 alphax() 两位的说法似乎有矛盾。98,2000都是 方法共享,数据独立 么?
      

  11.   

    不是操作系统的问题,DLL本来即使用来共享代码的,但是数据是进程间独立的
    不过,我觉得你的问题不是怎么去想法使得DLL直接能都够存取应用程序的数据,
    你应该考虑:你的设计是否有问题呢?
    你的应用程序,应该将DLL作为一个服务程序来看待,程序应该主动提供参数,然
    后调用DLL,DLL做服务操作,最后返回结果,然后程序再将结果保存到自己的数据区。
      

  12.   

    alphax() 说得没错,我也使没办法才出此下策的,因为我想些个hook的类,但是hookproc用类里面的函数是不现实的,见这个贴子:(里面有所有代码)
    http://expert.csdn.net/Expert/topic/1135/1135662.xml?temp=.5984461所以我就想,用整个单元做一个数据对象,当initialazation的时候创建它,调用add方法添加热键的时候再单元局部变量里面维护一个数组,来保存所有注册的热键。finalization的时候unhook所有的。pas编译成exe自然没什么问题,但是编译成dll呢?要是数据共享,而且inialaiation触发多次,这种做法显然就不可行了!所以我才问出这么一个问题来//////////////////////////哪位如果有更好的办法,能够把键盘hook作成一个通用类,请不吝赐教!