2011-04-11 9 views
2

私は、混合DLLを参照するアプリケーション(CLI)を持っています。 DLLは静的関数を持つ "ref"クラスを実装しています。ここでC++でref-class関数を呼び出す(混合コード)

がEXE内REF-クラスの(部分)コード

public ref class AAA 
{ 
public: 
static bool Write(System::String^ sz); 

// Not accessible!!! 
public: static BOOL TraceRect(const CRect& rc); 
}; 

で、C++のコードで、私は両方の機能を呼び出すようにしようとしている:

// This works 
AAA::Write("hello"); 

// This doesn't !!! 
CRect rc(0, 0, 12, 234); 
AAA::TraceRect(rc); 

どのようにすることができます私は2番目の関数にアクセスしますか?

+1

これはC++のようには見えません。 –

+1

'C++ - cli'タグが追加されました。これはもっと役立つでしょう。 – Xeo

+0

ただの推測ですが、マネージクラスの静的メソッドにアンマネージデータ型を配置しました。さらに、 'const'はCLRでサポートされていないので、クラスをILにコンパイルするときにどのように解釈するのかよくわかりません。私はあなたの公開されていない静的メソッドを、管理されたクラスに入れるのではなく別の場所に分割します。 –

答えて

4

これは、ネイティブタイプ(この場合はCRect)がデフォルトで非公開として扱われたためです。したがって、このメソッドにアクセスできる間は、rcのパラメータ型にアクセスできません。あなたはそれをmake_publicを使ってアクセス可能にすることができます: http://msdn.microsoft.com/en-us/library/ms235607.aspx

C3767とmake_publicを検索すると、そのトピックに関するその他の情報がたくさん見つかります。

+0

良いアイデアだが、うまくいかない。私はさらに 'CRECT'を 'RECT'に変更しようとしました...今はDLLもリンクされず、LNK2022(メタデータ)を取得します。 – Seb

+0

問題の原因を調べてください。パラメータが* no *であれば問題が発生しますか? CRectとRECTの間の変更は、実際には何も新しいことを試みているわけではありません。 –

+0

@Seb: '#pragma make_public(CRect)'が動作するはずです。 CRectが名前空間に属している場合は、 'make_public'のために' NAMESPACE :: CRect' –

関連する問題