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

C在对COM对象执行某些操作之前,请检查它是否可用。

  •  4
  • cichy  · 技术社区  · 15 年前

    在运行使用COM对象的操作之前,如何检查COM对象是否存在(已注册/可用/可以无问题运行)?

    我的应用程序应该使用其他应用程序COM(InteropServices),但在开始某些操作之前,我想检查是否可以创建COM对象。

    如果COM在同一个目录中,那就不成问题了,但事实并非如此。

    冗长的 我想检查一下这样的东西:

    CDNBase.ApplicationClass App = new CDNBase.ApplicationClass();
    

    会导致可捕获的异常或其他。我无法创建好的消息框并阻止一些事件,直到它被修复。 任何其他解决方案,比如检查名称空间是否存在或者某个东西,都是可以的(我猜:d)

    我试过使用Try/Catch,但失败了,谷歌没有给我带来任何特别的东西,所以我请求你的帮助。

    提前谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mitch Wheat    15 年前

    你试过接球吗 ComException :

    try
    {
    ...
    }
    catch(System.Runtime.InteropServices.COMException ex)
    {
        // log error message
        throw;
    }
    

    更新 抱歉,我不是建议取消例外。已更新。

    或者,您可以在注册表中搜索组件的 ClassID :

    HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32 
    

    默认值将包含指向dll的文件系统完整路径。

        2
  •  2
  •   Hans Passant    15 年前

    没有人喜欢看到错误消息。但这是一个特殊情况,不要这样做。COM激活一直很难排除故障。但是最近的一些发展,如64位操作系统、注册表虚拟化、注册表重定向和UAC,已经以指数级的速度增加了它可能无法工作的方式的数量。

    客户的IT人员最不需要的是另一层代码,它可以静默地更改激活规则或抑制诊断信息。他们会在不起作用的时候向你开枪,而且他们也不知道为什么。

    首先问问你自己,当互操作不起作用时,你的程序是否仍然有用。如果没有,那么什么也不做,只需让异常终止您的程序,但要确保异常的详细信息是可见的。

    如果它仍然有用,那么只需在程序中添加一个配置选项,让它在不进行任何尝试的情况下绕过互操作。