私は次の構造を持っています:
//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;
}
私の問題は、アンマネージコードのどこかで、Send関数を呼び出さなければならないことです。マネージコードSendから関数を呼び出しますが、Send関数はParserクラスからTransmitメソッドを呼び出します。問題は、デバッグすると、pParserインスタンスが空になることです(コンストラクターで以前にインスタンス化したことがある場合でも)。
これはガベージコレクターの問題ですか、それとも仮想テーブルの誤解を招きますか?どうすれば修正できますか?ありがとう !
更新: さらにデバッグした後、たとえば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-> Deliver(mMessage)を呼び出すときです。mParentのインスタンスはありません。次に、ラッパーでは、mParentは空です(値= null)。アンマネージドIInterfaceからのメソッドにのみアクセスし、ラッパーCInterfaceからのWrapper^にはアクセスしないようなものです。