2013-10-03 2 views
1

Я начал экспериментировать с dll и столкнулся с этой проблемой. У меня 2 решения (VS 2012) 1. Где генерировать DLL (содержит: templatedll.h, templatedll.cpp, templatedllshort.h) 2. Где проверить его (я использую поэтому templatedllshort.h)Ошибка проверки времени выполнения # 2 - поврежден стек вокруг переменной '

Так что это код моего первого (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(); 
} 

шаблонный llshort.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() 

Может ли один увидеть, где проблема? Спасибо

+0

Я не думаю, что вы можете переопределить этот класс и заставить его работать. Я имею в виду, что класс должен быть того же размера в публичном и закрытом заголовке. – drescherjm

ответ

1

(это короткий заголовок, который скрывает все личные части моего класса)

Это фатальное. Код клиента вашей DLL передаст неправильный размер распределителю для создания объекта. И создайте слишком маленький объект. В этом конкретном случае он не резервирует достаточное пространство стека для объекта. Сама DLL теперь будет записывать в память, которая не была выделена. Предупреждение/RTC было предназначено для того, чтобы вы не попали в эту проблему.

Не лгите о занятиях.

Используйте интерфейс и заводскую функцию, чтобы скрыть детали реализации.

+0

спасибо, я не думал об этом. Что объясняет его ! –

0

Я думаю, вам нужно использовать тот же заголовок как для DLL, так и для приложения драйвера. Кроме того, я не вижу, где вы импортируете DLL в приложение-драйвер.

1

Проблема возникает из #include "templatedllshort.h". Вы не можете «скрывать» личную информацию, подобную этой. Можете ли вы использовать #include "templatedll.h" и проверить, что вы больше не сталкиваетесь с этой проблемой?

+0

Я пробовал это, прежде чем публиковать здесь, и был удивлен, почему он работает, пока альтернатива не сделала. Теперь я знаю –

0

Определение класса должно быть одинаковым в каждом исходном файле, иначе это неопределенное поведение.

Смежные вопросы