4

簡単: WinAPI 関数の結果 を明示的にマーシャリングするにはどうすればよいですか?


C# で WinApi 関数のパラメーターをマーシャリングする方法は知っていますが、戻り値もマーシャリングするにはどうすればよいですか? それとも、実際にそれらをマーシャリングする必要がありますか? 私は、WinAPI が(アンマネージ コードではハンドルも intである) のみBOOLまたはすべての型を返すことを理解しています。INT

// common signature
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename);

// my prefered signature because easy to handle the result
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern FileAttributes GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename);

FileAttributes列挙型であり、各値は簡単にキャストできるため、intこの表記法で安全だと確信しています。しかし、パラメーターで行うように、この 1 つの署名で結果をマーシャリングできますか? 私は実際にはMarshalクラスとMarshalAs属性しか知りません。

4

1 に答える 1

5

はい、できます。[return:]たとえば、次のような属性構文を使用するだけです。

[return: MarshalAs(UnmanagedType.LPStruct)]

しかし、あなたの場合、マーシャリングは必要ありません。そのような整数型を変換するためにマーシャリングは必要ないため、例では2番目の形式を使用してください。

本当に必要な場合はGetFileAttributes()、戻り値の有効性をチェックする呼び出しを行うパブリック メソッドを作成できます。

于 2013-07-26T10:39:49.183 に答える