1

我已经开始尝试使用 dll 并遇到了这个问题。我有 2 个解决方案(VS 2012) 1. 我在哪里生成 dll(包含:templatedll.h、templatedll.cpp、templatedllshort.h) 2. 我在哪里测试它(因此我使用 templatedllshort.h)

所以这是我的第一个(dll)解决方案的代码

模板dll.h

class __declspec(dllexport) Echo
{
private:
    int output;
    void echo_private();

public:
    Echo();
    Echo(int output_);
    ~Echo();
    void echo_public();
};

模板dll.cpp

#include "templatedll.h"
#include <iostream>

Echo::Echo()
{
    output = 0;
    std::cout << "Echo()\n";
}

Echo::Echo(int output_)
{
    this->output = output_;
    std::cout << "Echo(int)\n";
}

Echo::~Echo()
{
    std::cout << "~Echo()\n";
}

void Echo::echo_private()
{
    std::cout << "this is output: " << this->output << std::endl;
}

void Echo::echo_public()
{
    echo_private();
}

templatedllshort.h(这是一个简短的标题,它隐藏了我班级的所有私人部分)

class __declspec(dllimport) Echo
{
public:
    Echo();
    Echo(int output_);
    ~Echo();
    void echo_public();
};

我测试它的第二个解决方案

#include "templatedllshort.h"

int main()
{
    Echo e(1);  
    e.echo_public();
    return 0;
}

一切都正确链接,两种解决方案都可以编译和运行。返回 0 之后出现运行时检查失败;陈述。这是预期的输出:

Echo(int)
this is output: 1
~Echo()

任何人都可以看到问题出在哪里?谢谢

4

4 回答 4

1

问题来自#include "templatedllshort.h". 你不能像这样“隐藏”私人信息。你可以使用#include "templatedll.h"并检查你不再面临这个问题吗?

于 2013-10-03T15:01:17.533 回答
1

(这是一个简短的标题,隐藏了我班级的所有私人部分)

那是致命的。DLL 的客户端代码会将错误的大小传递给分配器以创建对象。并创建一个太小的对象。在这种特殊情况下,它不会为对象保留足够的堆栈空间。DLL 本身现在将写入未分配的内存。/RTC 警告旨在让您远离此类麻烦。

不要在课堂上撒谎。

使用接口和工厂函数来隐藏实现细节。

于 2013-10-03T15:01:43.340 回答
0

我认为您需要为 DLL 和驱动程序应用程序使用相同的标头。另外,我看不到您在驱动程序应用程序中导入 DLL 的位置。

于 2013-10-03T15:00:54.343 回答
0

每个源文件中类的定义必须相同,否则它是未定义的行为。

于 2013-10-03T15:03:05.917 回答