나는 다음과 같은 구조를 가지고 :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에서만 메서드에 액세스하는 것과 같습니다.
이것은 표준 C++가 아닙니다. 좀 더 구체적으로 태그를 달아주세요. –
Visual Studio에서 관리되지 않는 디버깅을 사용합니까? 실행 프로젝트의 디버그 옵션에는 "관리되지 않는 코드 디버깅 사용"설정이 있습니다. – Nick
@Oli Charlesworth : 감사합니다 icecrime. @ 닉.저는 Labview에서 Managed Library를 호출하고 있습니다. 그리고 'Attach the Process'가 끝나면 코드를 디버깅 할 것입니다. 관리되지 않는 코드 디버깅을 계속 사용 가능하게 설정해야합니까? 내가 뭘 찾아야하니? –