奇怪的行为视觉工作室DLL和.exe?

时间:2014-03-31 09:14:00

标签: c++ visual-studio-2012 dll pimpl-idiom

我的代码有一个非常奇怪的结果:

我正在使用boost.any(之前使用void *)从.exe中的.dll返回地址。

dll有这样的功能:

boost::any User::getNativeHandle() {
    return boost::any(pimpl_->adressOfObject_);
}

我的exe,这样的代码:

class SomeClass {   
public: 
   SomeClass(User & user) {
      scopedResource_([&](InternalType * s) {
        InternalTypeConstruct(..., user.getNativeHandle());
      }
   }
private:
   ScopedResource<InternalType> scopedResource_;
};

事实和观察:

  • User对象是在.exe中创建的,但它是一个dll类。
  • 从.dll内部和外部打印的指针具有相同的地址,因此它似乎是正确的对象。
  • 打印值地址始终是4的倍数,因此它似乎是有效的 至少解决。 64位机器窗口8.
  • 我不得不使用/NODEFAULTLIB: ...删除一些运行时库,但现在它似乎已正确设置。
  • 演员似乎从boost.any回到我在.exe中的类型是正确的,因为我之前故意让它失败,以确保这一点。

  • User::getNativeHandle .dll返回的指针是一种类型,它是指向另一个库的类型的指针,一个没有任何.dll的.lib库,即一个真正的静态库。

它最终与SEH 0x00000005崩溃。我的类User暴露了接口,我也试图为Pimpl导出Impl类,但似乎什么也没做。

有什么想法吗?这个错误让我很生气:)。

0 个答案:

没有答案