3

このコード:

[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags);

次のコード分析の問題が発生します。

CA1901 P/Invoke 宣言は移植可能でなければなりません

コードで宣言されているように、P/Invoke 'IconUtil.SHGetFileInfo(string, uint, out IconUtil.SHFILEINFO, uint, uint)' の戻り値の型は、64 ビット プラットフォームでは 4 バイト幅になります。この API の実際のネイティブ宣言は、64 ビット プラットフォームでは 8 バイト幅である必要があることを示しているため、これは正しくありません。「int」の代わりに使用するデータ型を決定するには、MSDN プラットフォーム SDK のドキュメントを参照してください。

私はどうしたらいいですか?「MSDNに相談」してみましたが、問題が何を意味するのかよくわかりません。


同じ行でこれも取得します:

CA1060 P/Invokes を NativeMethods クラスに移動

これは P/Invoke メソッドであるため、'IconUtil.SHGetFileInfo(string, uint, out IconUtil.SHFILEINFO, uint, uint)' は、NativeMethods、SafeNativeMethods、または UnsafeNativeMethods という名前のクラスで定義する必要があります。

4

2 に答える 2

4

警告が参照している MSDN ページは、ネイティブ関数のドキュメントですSHGetFileInfo。署名は次のようになります。

DWORD_PTR SHGetFileInfo(
  __in     LPCTSTR pszPath,
  DWORD dwFileAttributes,
  __inout  SHFILEINFO *psfi,
  UINT cbFileInfo,
  UINT uFlags
);

したがって、最初の警告はDWORD_PTR、ポインタ サイズの符号なし整数であるという事実に言及しています。つまり、 を使用する必要がありますUIntPtr

次に飛び出すのは、SHFILEINFO構造体が と示されていること__inoutです。つまり、 を渡す必要がありますref

したがって、p/invoke 宣言は次のようになります。

[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern UIntPtr SHGetFileInfo(
    string pszPath, 
    uint dwFileAttributes, 
    ref SHFILEINFO psfi, 
    uint cbFileInfo, 
    uint flags
);

最後の警告は簡単に解決できます。という名前のクラス内に p/invoke 宣言を配置するだけNativeMethodsです。

于 2012-04-28T12:54:09.723 に答える
0

の戻り値の型をintに変更することで、最初の問題を解決しましたIntPtr

于 2012-04-28T10:08:21.773 に答える