2010-11-26 38 views
3

我有以下結構:C++虛擬表錯誤?

//Unmanaged(.h) 
class myInterface 
{ 
public: 
    virtual bool Send(char* myChar); 
} 

//Managed (.h) 
class myClass; 

public ref class Parser 
{ 
    bool Transmit(String^ mString); 
} 

class myClass : public myInterface 
{ 
public: 
    virtual bool Send(char* myChar); 
private: 
    gcroot<Parser^> pParser; 
} 

我的問題是,在什麼地方我的非託管代碼,我必須調用發送功能。它從Managed code Send中調用函數,但Send函數從Parser類調用Transmit Method。問題是當我調試時,pParser實例是空的(即使我已經在構造函數中實例化了它)。

這是垃圾收集器問題還是虛擬表誤導?我如何解決它? 謝謝!

UPDATE: 一些進一步的調試之後,我已經意識到,如果我包括例如gcroot的其他實例:

gcroot<AppDomaion^> pDomain;

,然後,在代碼,試圖運行:

pDomain = AppDomain::CurrentDomain;

調試器將顯示與pParser相同的空值。我在做什麼有什麼問題?我應該以不同的方式實例化課程嗎?

UPDATE2:

託管/非託管基本是這樣的:

包裝:(wrapper.h)

public ref class Wrapper 
{ 
public: 
    Send(String^ mSendMessage); 
    Parse(String^ mMessageString); 
... 
private: 
    ComLayer* mComm; 
    CInferface mInterface; 
}; 

private class CInterface : public IIterface 
{ 
public: 
    virtual bool Deliver(CMessage mMessage); 
... 
private: 
    gcroot<Wrapper^> mParent; 
}; 

包裝(wrapper.cpp)

Wrapper::Send(String^ mSendMessage) 
{ 
... 
mComm->Send(mMessage); 
} 
Wrapper::Parse(String^ mMessageString) 
{ 
... 
} 

CInterface::Deliver(CMessage* mMessage) 
{ 
... 
//Here, mParent value is empty under Labview, not while Debug/VS/WindowsForm 
mParent->Parse(mMessageString) 
} 

非託管:(commLayer.h)

class CommLayer 
{ 
public: 
//Send: 
    bool Send(CMessage* mMessage); 
... 
private: 
//instead of CInterface, IInterface. 
    IInterface mInterface; 
}; 

非網管:(IInterface.h)

class IInterface 
{ 
public: 
//Response: 
    virtual bool Deliver(CMessage mMessage); 
}; 

的問題是,當非託管代碼調用mInferface->交付(mMessage); mParent沒有實例。然後,在包裝器中,mParent是空的(value = null);就像它只會訪問Unmanaged IInterface中的方法,而不是來自包裝器CInterface的Wrapper ^。

+0

這不是標準的C++;請你能用更具體的東西來標記它嗎? – 2010-11-26 09:19:50

+0

您是否在Visual Studio中打開了非託管調試?在可執行項目的調試選項中有一個「啓用非託管代碼調試」的設置。 – Nick 2010-11-26 09:27:41

回答

0

我相信,在連接到進程時,您需要打開Native和Managed調試。

您可以在「附加到進程」對話框中單擊「附加到:」框旁邊的「選擇」按鈕來執行此操作。

儘管通常將其設置爲「自動」,應該確定進程是否正在CLR中運行,併爲此對話框選擇正確的條目。