2012-08-05 66 views
1

首先我對任何錯誤表示歉意,英語不是我的母語。當我創建一個DLL導出對象時出現Stackoverflow錯誤

這裏是我的問題:我已經寫了出口從CSocket類派生的類的DLL,一切正常,只是客戶端非常精細,隱式加載DLL,必須按以下實例化對象:

// Inside client constructor (client class scope object pointer) 
CMyClass *m_lpMyObj = new MyClass; 

但如果對象實例化這樣的:

// Inside the client class header file (client class scope object) 
CMyClass m_myObj; 

當我運行客戶端,我得到的錯誤:

Unhandled exception at 0x775015de in MyApp.exe: 0xC00000FD: Stack overflow. 

同樣的問題,如果一個客戶端方法內我寫:

// Inside a client method (local object) 
CMyClass myobj; 

唯一的區別是所發生的誤差(當然)當調用該方法。

這裏類的一些細節:

// _AFXEXT defined for DLL project 

#ifdef __cplusplus 
extern "C" { 
#endif 

class CMyClass : public CSocket 
{ 
    DECLARE_DYNCREATE(CModbusConnector) 

public: 
    AFX_EXT_CLASS CMyClass(); // Only some methods are exported 
    AFX_EXT_CLASS virtual ~CMyClass(); 

    .... 
}; 

#ifdef __cplusplus 
} 
#endif 

的DLL是一個CWinApp派生對象(常規DLL),I編譯DLL作爲擴展DLL具有相同的結果。

在此先感謝。

問候,

尼爾

+1

'#ifdef __cplusplus'在這裏沒有意義:無論如何,該類不能用C調用約定導出。 – 2012-08-05 18:17:26

+0

絕對正確,謝謝。 任何建議來解決這個問題? Ciao, Neil – Neil 2012-08-05 23:22:13

回答

1

我認爲發生的事情是,DECLARE_DYNCREATE是一個對象,其大小在運行時計算。

當你說:

CMyClass *m_lpMyObj = new MyClass; 

它確實能分配爲實例所需的內存,但是當你說:

CMyClass m_myObj; 

它沒有在編譯的真實大小時間,只有'存根'的大小,所以當它試圖使用該對象時,它的寫入超出了分配空間的末尾。

+0

謝謝, 我想這可能是問題的原因。 你知道如何讓編譯器知道對象的真實大小嗎? 很顯然,我忘記了一些東西,因爲動態鏈接的MFC類可以用語法實例化(例如): CSocket sock; 並且它們使用DECLARE_DYNAMIC,DECLARE_DYNCREATE或DECLARE_SERIAL。 關心, 尼爾 – Neil 2012-08-05 22:30:54

+0

我可能是這樣的類只是使用一個內部指針來動態分配內存,分配在構造函數和釋放析構函數。對於導出,將會有一個函數來創建(返回一個句柄)和一個函數來關閉/銷燬。 – MRAB 2012-08-06 00:13:19

相關問題