代码之家  ›  专栏  ›  技术社区  ›  Steve

免注册COM和DLL清单

  •  10
  • Steve  · 技术社区  · 15 年前

    我正在尝试设置免注册COM,但有一个小问题,我的另一个COM对象可能是客户端。

    app.exe----->COM服务器/客户端dll(已注册或未注册)------>COM服务器dll(未注册)

    我的问题是,是否可以为第二个dll(COM服务器/客户端dll)创建清单?我没有对可执行文件的控制权,但是如果我有控制权,那么如果我为可执行文件创建了一个客户机清单,为COM服务器DLL创建了一个服务器清单,这就正常了。

    这是中间dll的清单文件。我试着把它嵌入外部。还是不行。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity type="win32" 
                        name="COMCliSer.dll" 
                        version="1.0.0.0" 
      />
      <dependency>
        <dependentAssembly>
          <assemblyIdentity 
                         name="COMSer.dll" 
                        version="1.0.0.0"                    
          />
        </dependentAssembly>
      </dependency>
    </assembly>
    

    在进一步的调查中,我可以让这一切工作,只要中间的dll也是免费注册的,并且exe有一个应用程序清单。一旦我注册了中间的dll,并删除了应用程序清单(我无法控制exe将使用我的dll),整个过程就会停止工作。

    如果exe没有清单,则不考虑dll的清单。我可以通过安排一切工作来证明这一点。然后把一个错误放在装配清单上。这会弹出通常的消息:

    无法创建进程:此应用程序启动失败,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。

    如果我随后删除应用程序清单,则应用程序将加载(尽管CoCreateInstance失败,因为不考虑依赖项)

    1 回复  |  直到 14 年前
        1
  •  5
  •   Chris Becke    15 年前

    只需将程序集依赖项添加到指向COM服务器dll的服务器/客户端dll清单中。

    请记住,程序集清单与“应用程序”清单不同:程序集清单描述程序集:为其命名,并列出其DLL。 应用程序清单是rt_清单嵌入资源,它描述了当前模块的依赖关系。

    因此,在最后的分析中,您将:

    • app.exe,带有外部(app.exe.manifest)或嵌入式rt_清单,描述对名为“acme.clientserver”的程序集的依赖性
    • acme.clientserver.manifest描述程序集,并将“clisrv.dll”列为无注册的COM DLL。
    • clisrv.dll,带有外部(clisrv.dll.2.manifest)或嵌入的rt_清单,描述对名为“acme.server”的程序集的依赖性
    • acme.server.manifest,描述程序集,将serv.dll列为无注册的COM dll。
    • serv.dll——可能会,也可能不会反过来有清单列出更多依赖程序集。

    从技术上讲,可以使用dll的名称调用程序集,并将程序集清单和dll清单合并在一起-Win32加载器支持此功能,但在应用程序清单中有效的某些设置在程序集清单中无效,这可能导致无法加载生成的程序集。这也使得数字签名变得非常困难。


    警告exe必须具有清单:通常exe的清单设置进程默认激活上下文。我不能百分之百地确定当exe没有清单时Windows的行为,但我很确定dll中的清单仍将被处理。

    这意味着问题归结为cocreateinstance中缺少隔离支持——出于某种原因——默认情况下——cocreateinstance只在默认激活上下文中查找reg-free-com条目。

    重写它的方法是使用 Activation Context API

    基本方法是调用:

    • createactctx-从DLL清单创建激活上下文。
    • activateactctx-激活上下文
    • CoCreateInstance-现在将在当前激活上下文中搜索Reg-free COM条目。
    • DeactivateAcatCtx-恢复默认激活上下文。

    您可以添加/d隔离_-aware_-enabled来包装大多数受激活上下文影响的Windows调用,因为某些原因CoCreateInstance没有包装:/

    推荐文章