从DLL边界

时间:2016-06-21 19:25:51

标签: c++ exception dll exception-handling raii

有一些关于从构造函数抛出并抛出DLL边界的问题,但我找不到能够解决这种特定情况的问题。

我读过两件事:

  1. 如果发生错误,构造函数应抛出异常。这可确保对象不会处于僵尸状态,无需使用函数来检查对象的状态,并强制执行RAII。所有好事。

  2. 我们不应该跨越DLL边界。堆内存不共享,可能会发生不好的事情。这个细节让我有点懊恼,但到处都是一般建议不要这样做,所以我不会。这里的异常(!)是所有代码都使用相同的编译器编译的,但即使这似乎是编译器特定的,因此也不可靠。错误代码!

  3. 现在我的问题:

    如何安全地创建在DLL中某处定义的类的实例?

    我认为可能唯一安全的方法是让DLL中的所有(导出)构造函数不会抛出异常,或者可能提供导出的自由函数,这些函数返回指向对象的指针,如果该对象可能为NULL抓住了一个例外。

    任何人都可以提出更合适的建议,或者告诉我,我的错误结束了吗?

1 个答案:

答案 0 :(得分:1)

我认为你的方法是正确的。让我们为对象导出工厂而不是对象本身。

顺便说一句,它可以被投影,这样你的每个DLL都可以有一个同名的导出函数。因此,在该导出函数中,您可以使用if-else块来枚举DLL的所有工厂并尝试构造所请求的对象。 (比如说,对象用名称,名称crc32,名称哈希等标识)

我认为这可能是几种方法。 例如,您可以在DLLMain / Attach事件上的公共对象上注册每个DLL工厂而不是公共导出函数,或者处理自定义DLLMain事件 - 这样您就可以将Neo对象地址设置为DLLMain的一个参数,并为每个DLL注册其上的确切工厂。

但常见的事情是当你的对象可以在ctor / init方法上抛出一个假设时使用工厂。