我有A,B两进程要有K.DLL; A用K.DLL的FUN1()函数,B用K.DLL的FUN2()函数. 
问题:
1.那K在内存中是不是有两份?,
2.在A中有没有FUN2()函数的副本?
3.如果K在内存中只有一份 那我多个进程调用一个DLL的一个函数那不乱套了吗?

解决方案 »

  1.   

    你可以认为K.dll在A和B进程中都存在一份copy. 尽管在物理内存中可能只有一份K.dll。 
      

  2.   

    你管那么多干嘛.如果那个 dll 只被读,不被写,那么无论多少个exe调用这个dll, 物理内存只有一份dll.一旦哪个进程手痒痒,改写dll, 根据ms的'最偷懒'方法---------写时复制 原理,那个dll将单独被copy,然后改写. 我说,你管那么多干嘛?
      

  3.   

    对了, 每个函数都可以看成一个模板, 不同的进程用各自的内存(堆栈),代入函数,所以不会乱套.对于类函数的话,你也不用担心, 每个类成员函数实际上的调用,都会传入this指针, 一般是最后一个被压入堆栈的. 你可以反汇编看看自己的程序.  也有直接用寄存器传入的,这个比较少见,个人对此有点迷惑.
      

  4.   

    AB进程都有完整独立并且唯一的K.DLL的地址空间(最起码在虚拟地址空间如此),DLL中的全局变量和函数永远不会冲突(共享数据段除外)。
      

  5.   

    如果我在DLL里有个类,我在应用程序中要构造这个类的两个对象,如过没两个副本怎么行 这两个对象有不同的数据 比如这个类 就是个我写的BUTTON 我的两个按钮大小不同
      

  6.   

    看样子楼主是刚用Dll,只要不涉及共享内存什么,最简单的办法就是你把Dll看作完全是你进程内存中私有的,不管你在dll里面做了什么,只对当前进程有效。有时间可以翻看专门讲Dll编程原则的书嘛。
      

  7.   

    我是个刚用 我还碰到了个问题 为什么我用loadlibary()动态加载DLL一定要在DEF文件中声明啊网上说不用的 我只在函数中用 extern "C" __declspec(dllexport)声明不行但可以用#pragra静态连接
      

  8.   

    不用了我解决了 是要把前面的WINAPI宏去掉.如:extern "C" __declspec(dllimport) void WINAPI InstallLaunchEv();  就不行 而extern "C" __declspec(dllimport) void W InstallLaunchEv();就行了  着是为什么啊?