2010-11-26 18 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<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 ^にはアクセスしないようなものです。

+0

これは標準のC++ではありません。より具体的なものでタグ付けしてください。 –

+0

Visual Studioでアンマネージデバッグを有効にしていますか?実行可能プロジェクトのデバッグオプションには、「管理されていないコードのデバッグを有効にする」という設定があります。 – Nick

+0

@Oli Charlesworth:Thanks icecrime。 @Nick。 私はLabviewからマネージドライブラリを呼び出しています。そして、「プロセスをアタッチ」した後、私はコードをデバッグしています。アンマネージドコードのデバッグを有効にする必要がありますか?私は何を探すべきですか? –

答えて

0

プロセスに接続するときは、ネイティブとマネージド両方のデバッグを有効にする必要があると思います。

[添付ファイル]ボックスの横にある[選択]ボタンをクリックすると、[プロセスに添付]ダイアログボックスでこれを行うことができます。

一般に、これは「自動」に設定されていますが、プロセスがCLRで実行されているかどうかを判断し、このダイアログの正しいエントリを選択する必要があります。

+0

まだ空のインスタンスがあります。私の問題は、仮想テーブルやガベージコレクタよりもAppDomainsに関連していると思います。私はまだ、1つのAppDomainですべてを呼び出す方法を理解しようとしています。または、少なくとも異なるAppDomainsでクラスを共有できるようにしています。 –

+0

Visual Studioでデバッグしているとき、ManagedCodeとUnmanagedCodeはConsoleTest.vshost.exe AppDomainで実行され、LabviewではManagedCodeが "Labview Domain for Run"で実行され、UnmanagedCodeは "Default Domain"で実行されます –

+0

したがって、 ConsoleTestアプリケーションで問題はありませんが、LabViewで実行すると空の値が表示されますか?あなたはより多くのコードを添付することができますか? – Nick