【问题标题】:Issues with running program from shared folder从共享文件夹运行程序的问题
【发布时间】:2012-02-16 11:09:31
【问题描述】:

我们目前正在根据提供给我们的 API 使用 .net 4.0 开发外部实用程序。

启动外部实用程序的主程序位于虚拟服务器上。因此,每个用户都通过转到网络文件夹并启动 .exe 来启动程序。

在主程序中有一个启动外部实用程序的选项,这些实用程序也是从网络路径启动的。

外部实用程序通过 api dll 连接到主程序。如果我没记错的话,这个dll是一个activex组件。

所有开发人员都在本地安装了主程序。这是在 .Net 中创建引用所必需的。如果安装不可用,则无法绑定引用。 对于开发人员来说,该工具是有效的。

但是对于没有完整安装的最终用户,该工具不起作用,因为它会进入注册表并查找一些值。这些在最终用户站不可用。

最终用户在尝试启动时收到此警告

无法将“System.__ComObject”类型的 COM 对象转换为接口类型“MegaMapp.MegaCurrentEnv”。此操作失败,因为 IID 为“{33D6C7C0-7D1B-450E-B8A4-8A8611D5B40F}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE))

{33D6C7C0-7D1B-450E-B8A4-8A8611D5B40F} 是最终用户无法使用的注册表项。

有没有办法告诉工具他们应该从 exe 所在的服务器而不是从本地注册表加载注册表项?

【问题讨论】:

    标签: c# .net dll registry


    【解决方案1】:

    ActiveX 组件始终需要在客户端计算机上进行注册表设置。

    您可以在应用程序启动期间使用 regsvr32 来注册 DLL,然后再使用它。我不确定是否需要管理员权限。

    我不会尝试在这样的环境中使用 ActiveX。

    activex dll 是我们与软件通信的唯一方式。因此,我们使用 api 调用构建了 .net 程序。

    构建一个使用 ActiveX 组件的服务器(例如 WCF 服务主机)并从每个客户端与该服务器通信。

    【讨论】:

    • activex dll 是我们与软件通信的唯一方式。因此,我们使用 api 调用构建了 .net 程序。无法在客户端机器上注册 dll,因为它们在服务器上。
    • 注册 dll 并不能解决这个问题。
    • 你是怎么得出这个结论的?
    • 我刚刚在终端用户站上做了一个测试。它不断抱怨不可用的注册表项。好吧,也许我会在本地机器上通过代码设置注册表项。
    • 您是如何尝试注册的?生成了哪些注册密钥?在 CLASSES reg 键中搜索 DLL 名称
    【解决方案2】:

    如果外部实用程序是 ActiveX EXE,那么您可以使用标准 regsvr32 实用程序在最终用户的机器上注册它。只需要第一次完成。

    【讨论】:

    • 外部实用程序是一个.net程序,它使用在exe所在服务器上注册的activex dll。
    • 我同意@jgauffin - 尝试通过 UNC 路径在客户端计算机上注册
    • 注册 dll 并不能解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多