我在用C ++编写的dll遇到问题。发生了一些非常奇怪的行为,我无法自行解决。

很难确切描述正在发生的事情,但是我会尽力而为。基本上,我的DLL中有一个带有单个私有属性和一个公共构造函数的类。当我初始化此类并退出程序时,出现错误。


  “运行时检查失败#2-变量'test'周围的堆栈为
  损坏”


我在这里有2个项目:


DLL名为“ testdll”。
控制台测试程序名为“ test”。


我将这个错误简化为最简单的可重现形式,以尝试缩小可能的原因,下面您将找到我的代码。

项目“ testdll”,文件testdll.h:

#include <string>

class testdll
{
public:
__declspec(dllexport) testdll(); // Empty but same error if prams are used.

private:
std::string _var;
};


项目“ testdll”,文件testdll.cpp:

#include "testdll.h"

testdll::testdll()
{
}


项目“ test”,文件testdll.h:

#include <string>

class testdll
{
public:
    __declspec(dllimport) testdll();
};


项目“ test”,文件stdafx.h:

#pragma once

#include "targetver.h"

#include <tchar.h>


项目“ test”,文件为test.cpp:

#include "stdafx.h"
#include "testdll.h"

int _tmain(int argc, _TCHAR* argv[])
{
testdll test;

return 0;
}


如果您希望我可以选择的存档格式向您发送Visual C ++ 2010解决方案文件。请帮忙!我不知道是怎么回事。

可选信息:
语言(或软件):C ++

已尝试:
删除有效的构造函数定义,但不是可用的解决方案,也不能解释问题。也可以将我所有的私有属性都做成指针,但是我不必这样做。

最佳答案

您正在使用两个头文件,它们没有声明相同的类。一个具有std :: string成员,另一个则没有。这非常非常糟糕,编译器没有为堆栈框架上的对象保留足够的空间。这是运行时错误告诉您的内容。顺便说一句,非常好用,否则很难诊断这种错误。

您可能会陷入困境,因为您仅将__declspec(dllexport)应用于构造函数,而不是整个类。您需要编写头文件,以便您的dll项目和exe项目都可以使用它。看起来应该像这样:

#undef DLLEXPORT
#ifdef BUILDING_MYDLL
#  define DLLEXPORT __declspec(dllexport)
#else
#  define DLLEXPORT __declspec(dllimport)
#endif

class DLLEXPORT testdll
{
public:
    testdll();
private:
    std::string _var;
};


右键单击您的DLL项目,属性,C / C ++,预处理器,预处理器定义。追加BUILDING_MYDLL

并删除您的exe项目目录中的testdll.h文件。设置“ C / C ++,常规,附加包含目录”设置,以便编译器可以在testdll项目目录(例如.. \ testdll)中找到标头

10-08 09:38