2013-10-03 107 views
1

我已經開始嘗試使用dll並遇到此問題。我有2種溶液(VS 2012) 1.我在哪裏產生的DLL(包含:templatedll.h,templatedll.cpp,templatedllshort.h) 2.如我測試(I使用因此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

該類的定義必須在每個源文件中相同,否則它是未定義的行爲。

相關問題