Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ visual studio dll和.exe的奇怪行为?_C++_Visual Studio 2012_Dll_Pimpl Idiom - Fatal编程技术网

C++ visual studio dll和.exe的奇怪行为?

C++ visual studio dll和.exe的奇怪行为?,c++,visual-studio-2012,dll,pimpl-idiom,C++,Visual Studio 2012,Dll,Pimpl Idiom,我用一些代码得到了一个非常奇怪的结果: 我正在使用boost.any(之前使用的是void*)从.exe中的.dll返回地址 dll具有如下功能: boost::any User::getNativeHandle() { return boost::any(pimpl_->adressOfObject_); } class SomeClass { public: SomeClass(User & user) { scopedResource_([

我用一些代码得到了一个非常奇怪的结果:

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

dll具有如下功能:

boost::any User::getNativeHandle() {
    return boost::any(pimpl_->adressOfObject_);
}
class SomeClass {   
public: 
   SomeClass(User & user) {
      scopedResource_([&](InternalType * s) {
        InternalTypeConstruct(..., user.getNativeHandle());
      }
   }
private:
   ScopedResource<InternalType> scopedResource_;
};
还有我的exe,代码如下:

boost::any User::getNativeHandle() {
    return boost::any(pimpl_->adressOfObject_);
}
class SomeClass {   
public: 
   SomeClass(User & user) {
      scopedResource_([&](InternalType * s) {
        InternalTypeConstruct(..., user.getNativeHandle());
      }
   }
private:
   ScopedResource<InternalType> scopedResource_;
};
class-SomeClass{
公众:
SomeClass(用户和用户){
scopedResource([&](内部类型*s){
InternalTypeConstruction(…,user.getNativeHandle());
}
}
私人:
ScopedResource ScopedResource;
};
事实和意见:

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

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

它最终与SEH 0x00000005崩溃。我的类
User
公开了该接口,我还尝试为Pimpl dll导出Impl类,但它似乎没有任何作用


你知道吗?这个错误让我很生气:)。

看起来你在DLL中分配内存,并试图从EXE访问它。你不能那样做;尝试改用GetProcessHeap/HeapAlloc/HeapFree。当您执行错误的强制转换时,VisualStudio通常会很宽容,但您确实不应该在打印之前强制转换指针。此外,VisualStudio还附带了一个调试器。你为什么要依赖于
std::cout
?@computerfreaker:大约20年前,Windows 95和Windows NT 3.1解除了这一限制。@m你确定吗?在最近的一次动态链接库中,我必须准确地处理这个问题(诚然,我先发制人地处理了它;我实际上没有面对它)。我在DLL中分配内存并将生成的类对象传递回EXE,我的研究表明DLL和EXE使用了不同的堆,因此我需要使用
Heap*
API来解决这个问题。该对象是在.EXE中构造的,只是类是来自DLL的代码。但它是在my.exe中创建的。