尝试在C ++中加载COM包装的DLL时出现未处理的异常

时间:2015-10-08 10:36:20

标签: c# c++ com gac loadlibrary

我在.NET中有一个程序集,我通过COM公开并强烈命名。

部署后,此程序集需要出现在GAC中。但是,我需要在创建其对象之前检查它是否存在。

不幸的是,如果GAC中没有程序集,即使在运行期间将对象创建放在try / catch中也会导致unhandled exception

因此,在我继续创建对象之前,如果DLL确实安装在GAC中,那么必须有一些方法可以验证。

HINSTANCE histLib;
    histLib = LoadLibrary("CLSInterOpLibrary.dll");
    if (histLib == NULL)
        return false;
    encode();

    CoInitialize(NULL);
    try
    {
        CLSInterOpLibrary::CLSInterOpInterfacePtr p(__uuidof(CLSInterOpLibrary::CLSInterOpClass));
        if (p == nullptr)
            return false;
        com_ptr = p;
    }
    catch (exception &e)
    {

    }

LoadLibrary给出一个NULL,无论该库是否存在于GAC中,可能需要某种路径...,和

CLSInterOpLibrary::CLSInterOpInterfacePtr p(__uuidof(CLSInterOpLibrary::CLSInterOpClass));

..如果DLL不存在,则给出未处理的异常。

那么如何检查DLL中是否GAC安装了C++?或者是否有更优雅的解决方案呢?

1 个答案:

答案 0 :(得分:1)

调用LoadLibrary(),这将起作用的可能性非常小,特别是如果程序集实际安装在GAC中的话。查找DLL是COM的工作,它使用注册程序集时编写的注册表项。

您需要修复错误处理,您从#import指令获得的CLSInterOpInterfacePtr智能指针类型将HRESULT错误代码转换为异常。你需要try / catch来捕获_com_error exception。试图捕获std :: exception将无效,_com_error不会从中获取。

这足以诊断注册问题或DLL丢失。您获得的样板_com_error ::错误值是REGDB_E_CLASSNOTREG(0x80040154),如果COM服务器未注册,则“未注册类”,如果CLR无法找到DLL,则更具体。 _com_error :: Description()方法为您提供了一个可以显示或记录的有些合理的消息。神圣的堆栈跟踪是遥不可及的。