短い答え:
あるプログラミング言語で使用されている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を呼び出す