2010-11-26 3 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를 호출합니다. 문제는 내가 Debug 할 때 pParser 인스턴스가 비어 있다는 것입니다 (비록 내가 이미 Constructor에서 인스턴스화했다하더라도).

가비지 수집기 문제 또는 가상 테이블이 오도됩니까? 어떻게 고칠 수 있습니까? 감사합니다.

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는 비어 있습니다 (값 = null). 그것은 래퍼 CInterface에서 Wrapper ^가 아닌 Unmanaged IInterface에서만 메서드에 액세스하는 것과 같습니다.

+0

이것은 표준 C++가 아닙니다. 좀 더 구체적으로 태그를 달아주세요. –

+0

Visual Studio에서 관리되지 않는 디버깅을 사용합니까? 실행 프로젝트의 디버그 옵션에는 "관리되지 않는 코드 디버깅 사용"설정이 있습니다. – Nick

+0

@Oli Charlesworth : 감사합니다 icecrime. @ 닉.저는 Labview에서 Managed Library를 호출하고 있습니다. 그리고 'Attach the Process'가 끝나면 코드를 디버깅 할 것입니다. 관리되지 않는 코드 디버깅을 계속 사용 가능하게 설정해야합니까? 내가 뭘 찾아야하니? –

답변

0

프로세스에 연결할 때 기본 디버깅과 관리되는 디버깅을 모두 사용해야한다고 생각합니다.

"첨부 대상 :"상자 옆에있는 "선택"버튼을 클릭하면 프로세스에 연결 대화 상자에서이 작업을 수행 할 수 있습니다.

일반적으로 프로세스가 CLR로 실행 중인지 여부를 결정하고이 대화 상자에 올바른 항목을 선택해야하는 "자동"으로 설정됩니다.

+0

나는 여전히 빈 인스턴스를 얻는다. 내 문제는 가상 테이블 또는 가비지 수집기보다 AppDomains와 더 관련이 있다고 생각합니다. 나는 여전히 하나의 AppDomain에서 모든 것을 호출하는 방법을 알아 내려고 또는 적어도 다른 AppDomains가 Class를 공유하도록 허용하려고합니다. –

+0

Visual Studio에서 디버깅하는 동안 ManagedCode 및 UnmanagedCode는 ConsoleTest.vshost.exe AppDomain에서 실행되고 Labview에서는 ManagedCode가 "실행을위한 Labview 도메인"에서 실행되는 반면 UnmanagedCode는 "기본 도메인"에서 실행됩니다 –

+0

그래서 ConsoleTest 애플리케이션에 문제가 없지만 LabView에서 실행하면 빈 값이 표시됩니까? 더 많은 코드를 첨부 할 수 있습니까? – Nick