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

没有regasm的COM互操作

  •  16
  • SLaks  · 技术社区  · 15 年前

    我是一个有限的用户,我需要编写一个在outlook 2003和2007中公开C库的outlook宏。

    我根本没有任何管理员权限,甚至在安装时也没有,所以我不能运行regasm,也不能(我想)编写托管外接程序。

    在这种情况下,是否有任何方法可以从VBA调用.NET代码,或者是否有其他解决方案?

    这只供个人使用,所以丑陋的黑客是完全可以接受的(只要它有效)

    5 回复  |  直到 11 年前
        1
  •  15
  •   SLaks    15 年前

    我通过跑步解决了这个问题 regasm /regfile 选项,并在结果中用hkcu替换hklm .reg 文件。

        2
  •  5
  •   Community CDub    7 年前

    RegistrationServices.RegisterAssembly .NET API(我认为是由 RegAsm.exe )

    还有 RegOverridePredefKey win32 api,不显眼但非常有用,它允许重新映射 HKEY_CLASSES_ROOT (用于 RegisterAssembly HKEY_CURRENT_USER\Software\Classes .

    一个聪明的程序可以同时使用 注册服务.注册器程序集 重新覆盖重新定义键 在下为COM客户端注册程序集 HKEY_CURRENT_USER .

    我自己也没试过,但我相信这是可行的。

    更新的 显然,这种方法 does works .

        3
  •  4
  •   okigan    15 年前

    注册COM对象(如ActiveX控件)并使其对系统中的所有用户可见需要管理权限。

    但是,如果不需要所有用户的可见性(或者由于用户限制有限而不可能),那么只能为特定用户注册COM对象。

    这通常是通过在hkcu而不是hklm中注册对象来完成的。这将适用于“常规”COM对象和通过.NET COM互操作公开的对象。

    其他更细粒度的方法也会存在,已经提到的regfree com可以处理特定的可执行文件。

    因此,考虑到上述所有解决方案,将所有信息捕获到注册表文件中并用hkcu替换hklm将起作用(不是很好,但工具也是如此)。

        4
  •  1
  •   SLaks    15 年前

    我发现了一种可能 solution 但是我还没有时间去尝试。

        5
  •  0
  •   Andrew Burns    15 年前

    不幸的是,由于COM的工作方式,如果没有管理员权限,将无法安装COM对象(interop或其他)。

    当您注册一个COM对象时,它会将多个条目写入 HKEY_CLASSES_ROOT 它是计算机级别的密钥,因此需要管理员权限。

    现在,因为您确实说过黑客解决方案是可以接受的,这里有一些可能的步骤可以让它工作;但是,如果您没有管理权限,我假设这不是您的机器,很可能是一台工作机器。采取这些措施很可能会让你被解雇。标准免责声明和其他:如果你是个白痴,被起诉/解雇/枪击/抢劫等,那不是我的错。

    首先,您需要了解需要添加哪些注册表项。确保您在一台“干净”的机器上执行此操作,该机器以前没有看到您的组件(或您知道的没有注册表项的机器)。安装机器监控程序以捕获密钥。 Here 是到一篇[无关]微软文章的链接,在那里他们推荐一些这样做的应用程序。

    现在,在监视器运行的情况下,安装您的加载项。现在您应该能够获得需要创建哪些键的日志。使用日志创建注册表导出文件。

    现在这就是问题的症结所在。基本上,您要做的是从一个bartpe映像启动机器,装载注册表并运行脚本;但是,键路径将不正确,因此脚本不会“开箱即用”工作。

    微软有一篇TechNet文章(但链接中有段落,所以在这里不好用),所以 Google 这应该是第一个结果。

    在阅读了那篇文章之后,您将看到机器注册表将作为 HKEY_LOCAL_MACHINE . 您需要做的是更改注册表导出以匹配新路径。完成此步骤后,您应该能够从BARTPE映像启动、装入注册表,然后导入脚本、卸载配置单元,然后重新启动。假设您将文件复制到正确的路径,那么它“应该”工作。

    祝你好运。