2012-05-11 6 views
0

MSVC++ 6.0で書かれた管理されていないC++ DLLがあります。それは私がC#.NET 4.0から呼び出す必要があるいくつかのスタンドアロンのC関数といくつかのクラスを持っています。私はこれについていくつかの間違ったスタートがありました。私はこれを行ういくつかの方法があることを知っています(COM、MC++ラッパー、PInvokeへの変換)が最も簡単ですが完全には明らかではありません。私の現在のアプローチは、C++ DLLをActiveXコントロールに変換することです。私が実行した問題は、VS 2010 C++ ActiveXプロジェクトのメソッドを再作成しようとすると、クラスウィザードで基本タイプ、CStringまたはCWndへのポインタ以外の戻り値の型が許可されないということです。構造体のコピーまたは構造体へのポインタを返すにはどうすればよいですか?メソッドパラメータの型は戻り型と同じ型制限があるため、パラメータとして返すことはできないようです。structまたはptrをActiveX C++クラスメソッドから構造体に戻す方法

Allowed ActiveX Return Types

答えて

0

あなたは、マネージコードに(または任意のコードへの)管理されていないデータを返すことになっていません。 ActiveXクラスがこのメモリを割り当てている場合は、ActiveXクラスが割り当て解除を行います。

この問題を解決するための一般的なアプローチは、HRESULTを返し、データサイズの生データを受け取るメソッドを持つことです。マネージコードのbyte []に​​マップされます)。

メソッドの実装では、配列を構造体のデータで上書きできます。

管理コードに戻すと、新しいメソッドに渡すために構造体をバイト配列として整列化する必要があります。メソッドMarshal.StructureToPtrがこのタスクに役立つ場合があります。

ポインタをパラメータとして受け取るクラスにメソッドを追加するには、ActiveXコントロールのデフォルトインターフェイスの「メソッドの追加」コンテキストメニューオプションを使用できます。以下の画像をご覧ください:

enter image description here

+0

ありがとうございました。しかし、Wikipediaの[HRESULT](http://en.wikipedia.org/wiki/HRESULT)を見てみると、単純に32ビットのエラー/ステータスコードが返されるようです。生のバイトとサイズのセットを返すには、どうすれば使用できますか? – JonN

+0

問題は、生データを返すことではありません。管理されたコードでデータを作成し、アンマネージコードに通常のパラメータとして渡して、結果データを書き込むことができます。生データを空白の紙として見ることができます。この場合、GetCurrentLookupItemメソッドに用紙を渡し、このメソッドの中で用紙に記入します。私は時間があれば明日いくつかのコードを追加しようとします。 – yms

+0

これは理にかなっていますが、私は、クラスウィザードで唯一許可されているパラメータ型が基本的なスカラー型である場合、ActiveXメソッドで空の生データバッファを受け取ることができるActiveXコントロールのメソッドをどのように作成するのか、 (BYTE、FLOAT、INT、UINT、HRESULTなど)。私はHRESULTパラメータを使用して、それを構造体またはそれに類するものへのポインタにキャストしますか? – JonN

関連する問題