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++クラスメソッドから構造体に戻す方法
0
A
答えて
0
あなたは、マネージコードに(または任意のコードへの)管理されていないデータを返すことになっていません。 ActiveXクラスがこのメモリを割り当てている場合は、ActiveXクラスが割り当て解除を行います。
この問題を解決するための一般的なアプローチは、HRESULTを返し、データサイズの生データを受け取るメソッドを持つことです。マネージコードのbyte []にマップされます)。
メソッドの実装では、配列を構造体のデータで上書きできます。
管理コードに戻すと、新しいメソッドに渡すために構造体をバイト配列として整列化する必要があります。メソッドMarshal.StructureToPtrがこのタスクに役立つ場合があります。
ポインタをパラメータとして受け取るクラスにメソッドを追加するには、ActiveXコントロールのデフォルトインターフェイスの「メソッドの追加」コンテキストメニューオプションを使用できます。以下の画像をご覧ください:
関連する問題
- 1. C構造体ポインタ - 構造体ポインタをモジュールから戻す方法は?
- 2. 構造体の構造体配列をvbaからc-dllに渡す方法
- 3. Cの構造体のマニュアルページ(struct sockaddr_in)の検索方法は?
- 4. V8 C++関数からjavascriptモジュールに構造体を戻す方法
- 5. struct C++内の構造体へのアクセス
- 6. C malloc構造体実装
- 7. 構造体の配列をstruct関数に渡す方法
- 8. 構造体のstructからJSONデータを抽出します。
- 9. ファイルCから構造体を初期化する方法は?
- 10. C構造体内の構造体内部の構造体
- 11. C++の構造体内の構造体
- 12. C#構造体の構造体配列をP/Invokeするには?
- 13. 構造体を別の構造体メンバにキャストする方法
- 14. 構造体を別の構造体に渡す方法
- 15. structワイドコムインラインアセンブリを使用して構造体ポインタからstructメンバーにアクセス
- 16. C/C++ - 構造体
- 17. C++構造体の初期化方法
- 18. MPI structとtypedefで構造体を含む構造体からMPI_Datatypeを作成します
- 19. function()からmain()に構造体の値を戻す
- 20. CからSwiftへのtypedef構造体
- 21. char * ptr to struct
- 22. 構造体callc c
- 23. C - 構造体
- 24. C構造体
- 25. 構造体配列をC++ DLLからC++へ渡す
- 26. Goで構造体メンバまたは埋め込み構造体にポインタを戻していますか?
- 27. Cプログラミング - ベース構造体型「派生」タイプ
- 28. f#からC#構造体を使用する方法#
- 29. C・ユニオン、構造体
- 30. C - エラー構造体
ありがとうございました。しかし、Wikipediaの[HRESULT](http://en.wikipedia.org/wiki/HRESULT)を見てみると、単純に32ビットのエラー/ステータスコードが返されるようです。生のバイトとサイズのセットを返すには、どうすれば使用できますか? – JonN
問題は、生データを返すことではありません。管理されたコードでデータを作成し、アンマネージコードに通常のパラメータとして渡して、結果データを書き込むことができます。生データを空白の紙として見ることができます。この場合、GetCurrentLookupItemメソッドに用紙を渡し、このメソッドの中で用紙に記入します。私は時間があれば明日いくつかのコードを追加しようとします。 – yms
これは理にかなっていますが、私は、クラスウィザードで唯一許可されているパラメータ型が基本的なスカラー型である場合、ActiveXメソッドで空の生データバッファを受け取ることができるActiveXコントロールのメソッドをどのように作成するのか、 (BYTE、FLOAT、INT、UINT、HRESULTなど)。私はHRESULTパラメータを使用して、それを構造体またはそれに類するものへのポインタにキャストしますか? – JonN