-1

私はマーシャリングについて読んでいました。アンマネージコードでこれが何を意味するのか、私は混乱しています。HRESULT、DWORD、およびハンドル。元のテキストは次のとおりです。

管理された環境と管理されていない環境の間にそのような互換性がないことは既にご存じでしょう。つまり、.NET には、アンマネージ コードの領域に存在する HRESULT、DWORD、および HANDLE 型は含まれません。したがって、.NET の代替品を見つけるか、必要に応じて独自のものを作成する必要があります。それがマーシャリングと呼ばれるものです。

4

3 に答える 3

8

短い答え:

あるプログラミング言語で使用されている1つのデータ型を別のプログラミング言語で使用されている別のデータ型に「マッピング」する必要があり、データ型が一致している必要があることを示しているだけです。

素早い回答:

これについては、詳細が正しくない可能性がありますが、概念は正しいです。

これらは、C /C++のWindowsヘッダーファイルで定義されているデータ型の一部です。これらは、C /C++のプリミティブデータ型をWindowsプログラミングで使用されるより意味のあるデータ型に「抽象化」する「マクロ」です。たとえばDWORD、C / C ++では実際には32ビットの符号なし整数ですが、64ビットプロセッサでは、ヘッダーファイルで64ビットの符号なし整数として定義されています。アイデアは、プロセッサが必要とするデータ型と言語が使用するデータ型の間に抽象化層を提供することです。

マーシャリング中に、この「dword」は宣言で指定したCLRデータ型に変換されます。これは重要なポイントです。DllImport

DWORDパラメータを受け取るWindowsAPIメソッドを呼び出したいとしましょう。を使用してC#でこの呼び出しを宣言する場合DllImportは、パラメーターのデータ型をとして指定する必要がありますSystem.UInt32。そうしないと、「悪いことが起こります」。

たとえば、パラメータのデータ型を誤って指定した場合ですSystem.UInt64。実際の呼び出しが行われると、API呼び出しが予期するよりも多くのバイトがスタックに配置されるため、スタックは破損します。これにより、アプリケーションのクラッシュ、Windowsのクラッシュ、無効な戻り値など、まったく予期しない動作が発生する可能性があります。

そのため、正しいデータ型を指定することが重要です。

問題のデータ型:

  • DWORDは、32ビットの符号なし整数またはCLRタイプとして定義されSystem.UInt32ます。
  • HANDLEは、CLRタイプIntPtr、、、UintPtrまたはHandleRef
  • HRESULTはSystem.Int32またはSystem.UInt32

参照:

  • P / Invokeを使用してマネージドクラスからアンマネージドAPIを呼び出すhttp://msdn.microsoft.com/en-us/library/aa719104(v=vs.71).aspxは、Windowsデータ型とそれに対応するデータ型を一覧表示した表があります。あなたの質問に具体的に答えるCLRデータ型。

  • Windowsデータ型(Windows)( http://msdn.microsoft.com/en-us/library/aa383751 (v=VS.85 ).aspx)

  • .NET列: http://msdn.microsoft.com/en-us/magazine/cc164123.aspxでP /Invokeを使用してC#でWin32DLLを呼び出す

于 2013-01-04T05:10:21.173 に答える
3

HRESULT: http://en.wikipedia.org/wiki/HRESULT

コンピュータ プログラミングの分野では、HRESULT は Windows オペレーティング システムで使用されるデータ型であり、以前の IBM/Microsoft OS/2 オペレーティング システムでは、エラー状態と警告状態を表すために使用されます。HRESULT の本来の目的は、OS/2 オペレーティング システムの異なるサブシステムでのエラー コード間の衝突を防ぐために、エラー コードの範囲を公的および Microsoft 内部で使用するために正式に配置することでした。HRESULT は数値エラー コードです。HRESULT 内のさまざまなビットは、エラー コードの性質とその発生元に関する情報をエンコードします。HRESULT エラー コードは、COM プログラミングで最も一般的に使用され、標準化された COM エラー処理規則の基礎を形成します。

DWORD: http://en.wikipedia.org/wiki/DWORD#Size_families

ハンドル: http://en.wikipedia.org/wiki/Handle_ (コンピューティング)

コンピュータ プログラミングでは、ハンドルはリソースへの抽象的な参照です。ハンドルは、アプリケーション ソフトウェアがデータベースやオペレーティング システムなどの別のシステムによって管理されるメモリ ブロックまたはオブジェクトを参照するときに使用されます。ポインターは文字通り、それが参照する項目のアドレスを含みますが、ハンドルは外部で管理される参照の抽象化です。その不透明度により、ハンドルを無効にすることなく、システムによって参照対象をメモリ内で再配置できますが、これはポインターでは不可能です。間接的な追加レイヤーにより、参照先で実行される操作に対する管理システムの制御も強化されます。通常、ハンドルは、トゥームストーンのグローバル配列へのインデックスまたはポインターです。

于 2013-01-04T04:17:04.883 に答える
0

HRESULTDWORD、およびHANDLEtypedef、Windows 環境で *un*managed コードをコンパイルするプログラマーが使用するために Microsoft によって定義された (つまり、プレーン データ型を表す) です。これらは、Microsoft が提供する C (または C++) ヘッダー ファイルで定義され、通常、Microsoft Visual Studio 内で作成されたアンマネージ Windows プロジェクトに自動的に含まれます。

于 2013-01-04T04:51:12.993 に答える