MSVC++ 6.0 で最初に記述されたアンマネージ C++ DLL があります。これには、C# .NET 4.0 から呼び出す必要があるいくつかのクラスといくつかのスタンドアロン C 関数があります。私はこれについていくつかの誤ったスタートを切りました。これを行うにはいくつかの方法 (COM への変換、MC++ ラッパー、PInvoke) があることは知っていますが、どれが最も簡単かは完全には明らかではありません。私の現在のアプローチは、C++ DLL を ActiveX コントロールに変換することです。私が遭遇した問題は、VS 2010 C++ ActiveX プロジェクトでメソッドを再作成しようとすると、Class Wizard が基本型、CString、または CWnd へのポインター以外の戻り型を許可しないことです。構造体のコピーまたは構造体へのポインターを返すにはどうすればよいですか? しません」
質問する
976 次
1 に答える
0
アンマネージド データをマネージド コード (または任意のコード) に返すことは想定されていません。ActiveX クラスがこのメモリを割り当てている場合、ActiveX クラスはその割り当て解除を担当します。
この問題を解決するための一般的なアプローチは、HRESULT を返し、データ サイズの生データを受け取るメソッドを用意することです。または、より管理されたようなものが必要な場合は、バイトのセーフ配列を受け取ることができます (これは byte にマップできます)。 [] マネージド コード)。
メソッドの実装では、配列を構造体のデータで上書きできます。
マネージ コードに戻ると、構造体を新しいメソッドに渡すために、構造体をバイト配列としてマーシャリングする必要があります。メソッドMarshal.StructureToPtrは、このタスクに役立ちます。
ポインターをパラメーターとして受け取るメソッドをクラスに追加するには、activex コントロールのデフォルト インターフェイスの [メソッドの追加] コンテキスト メニュー オプションを使用できます。以下の画像を参照してください。
于 2012-05-11T19:29:29.343 に答える