2012-04-29 100 views
0

我遇到了用C++編寫的DLL的問題。有一些非常奇怪的行爲繼續,我一直無法自己解決。當C++ DLL程序退出時:運行時檢查失敗#2

很難描述到底發生了什麼,但我會盡我所能。基本上我有一個類,在我的DLL中有一個私有屬性和一個公共構造函數。 當我初始化這個類,然後退出程序時,我得到一個錯誤。

「運行時檢查失敗#2 - 堆棧圍繞變量 '測試' 是 損壞」

我有2項目這裏:

  1. 的DLL命名「testdll」。
  2. 命名爲「測試」控制檯測試程序。

我把這個錯誤歸結爲最簡單的可重複的形式來試圖縮小可能的原因,下面你會發現我的代碼。

工程 「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() 
{ 
} 

項目的 「測試」,文件testdll .H:

#include <string> 

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

項目的 「測試」,stdafx.h文件:

#pragma once 

#include "targetver.h" 

#include <tchar.h> 

項目的 「測試」,文件TEST.CPP:

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

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

return 0; 
} 

如果你想我可以在視覺送你C++ 2010解決方案文件,以您選擇的歸檔格式。請幫忙!我不知道發生了什麼事。

可選信息: 語言(或軟件):C++

已經嘗試過: 刪除構造函數的定義,它的工作原理,但不是一個可用的解決方案,也沒有說明這個問題。也使我所有的私人物業成爲指針作品,但我不應該這樣做。

回答

1

您正在使用兩個頭文件,它們不聲明相同的類。一個有std :: string成員,另一個沒有。這非常糟糕,編譯器沒有爲堆棧幀上的對象預留足夠的空間。這是運行時錯誤告訴你的。順便說一句,非常好的功能,這種錯誤是難以置信的難以診斷,否則。

您可能進入了這個pickle,因爲您只將__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)

0

導出類和類成員從一個DLL是非常非常脆弱的,因爲你剛剛發現。如果庫和客戶端都不使用完全相同的類佈局(取決於各種編譯器設置),那麼事情就會失敗。

對於您的情況,您可能在class testdll中使用std::string的不兼容版本。也許一個是爲了調試而編譯的,一個是爲了發佈。或者一個使用靜態運行時庫,另一個使用DLL運行時。誰能說?

無論如何,只要您從DLL中導出C++功能,就可以將自己鎖定在該編譯器的版本和設置中。這是一個維護噩夢。

使用僅v表的基類或C兼容包裝函數。

+0

DLL項目和使用它的測試項目都在相同的解決方案中文件,所以這些類型的環境問題不應該造成這一點,據我所知。 – Aloxis 2012-04-29 06:23:19

+0

@Aloxis:仍然有許多每個項目設置需要處理,必須完美匹配。另外,並非所有的設置都可以使用。 'std :: string'分配內存,兩個項目都必須設置爲使用共享運行時分配器(使用DLL運行時庫)。 – 2012-04-29 06:28:10

+0

我不知道這意味着什麼,明天我會看看它,當我沒有那麼疲憊,看看它是否能解決這個問題。非常感謝您花時間回答。 – Aloxis 2012-04-29 06:53:36

相關問題