1

私はdllを試し始めましたが、この問題に遭遇しました。私には2つの解決策があります(VS 2012)1. dllを生成する場所(次を含む:templatedll.h、templatedll.cpp、templatedllshort.h)2.テストする場所(したがってtemplatedllshort.hを使用)

これは私の最初の(dll)ソリューションのコードです

templatedll.h

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

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

templatedll.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();
};

私がテストする2番目のソリューション

#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

クラスの定義は、すべてのソース ファイルで同じでなければなりません。そうでない場合、未定義の動作になります。

于 2013-10-03T15:03:05.917 に答える