问一个有关内存的问题,如果一个COM联结了其他的DLL,然后此COM被同一进程多个线程生成多个COM对象,请问此COM联结的dll是否也被重复装入此进程的内存中间?是否COM静态联结和动态联结(LoadLibrary)结果不同?
  有办法验证吗?在线等高手解答!

解决方案 »

  1.   

    代码不会因为线程的数量而重复加载,即使是进程,也都只是增加dll的一个引用记数而已,不会重复装入内存,但会被重复影射到不同进程的内存空间中。“是否COM静态联结和动态联结(LoadLibrary)结果不同?”未解。动态指不用CoGetClassObject(名字可能记错)函数得到类厂指针,而代替COM运行时期库直接调用导出函数GetDllClassObject(名字可能记错)?
    如果这样,那么得到的类厂的指针将不是一个代理,因此也就不能实现同步效果(即套间,如STA等),而通过此类厂创建的对象的指针也将都不是代理,也就是不具有同步效果(不能实现套间技术),但是如果楼主自己能保证客户端的程序的逻辑不会导致线程冲突大可这样,虽然这算一种“犯法”行为。如果要检验上面的说法,楼主可象上面说的得到类厂指针(这样其实可以连COM运行时期库都不加载,不调用CoInititalize等相关函数),而COM组件又编成需要STA套间的,然后客户端用多个线程使用这个对象,楼主将会看到COM承诺的不用同步将会失败。