は、私は、次の構造を有する: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<AppDomaion^> pDomain;
した後、コードは、実行しようとした:いくつかのさらなるデバッグ後 、私は、例えばgcrootの他のインスタンスが含まれている場合ことに気づいてき
pDomain = AppDomain::CurrentDomain;
デバッガpParserと同じ空の値を示すであろう。私がやっていることに何か間違っていますか?クラスを別の方法でインスタンス化する必要がありますか?
アップデート2:
ラッパー::(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のインスタンスはありません。次に、Wrapperで、mParentは空です(値= null)。それは、Unmanaged IInterfaceからのメソッドにのみアクセスし、ラッパーCInterfaceからのWrapper ^にはアクセスしないようなものです。
これは標準のC++ではありません。より具体的なものでタグ付けしてください。 –
Visual Studioでアンマネージデバッグを有効にしていますか?実行可能プロジェクトのデバッグオプションには、「管理されていないコードのデバッグを有効にする」という設定があります。 – Nick
@Oli Charlesworth:Thanks icecrime。 @Nick。 私はLabviewからマネージドライブラリを呼び出しています。そして、「プロセスをアタッチ」した後、私はコードをデバッグしています。アンマネージドコードのデバッグを有効にする必要がありますか?私は何を探すべきですか? –