MSOCAF验证 - P / Invoke应该是便携式的

时间:2014-11-18 11:12:01

标签: c# pinvoke code-analysis

我有这个MSOCAF错误:

  

正如在代码中声明的那样,P / Invoke'CompoundDocument.CreateILockBytesOnHGlobal(IntPtr,bool,out CompoundDocument.ILockBytes)'的参数'fDeleteOnRelease'在32位平台上将是1字节宽。这是不正确的,因为此API的实际本机声明表明它应该在32位平台上宽度为4个字节。有关确定应使用哪种数据类型而不是'bool'的帮助,请参阅MSDN Platform SDK文档。

这是代码:

 [DllImport("ole32.dll")]
 static extern IntPtr CreateILockBytesOnHGlobal (
    IntPtr hGlobal,
    [MarshalAs(UnmanagedType.U1)] bool fDeleteOnRelease,
    out ILockBytes ppLkbyt);

我搜索要使用的数据类型而不是bool但我失败了。什么是4字节宽的替代方案?

1 个答案:

答案 0 :(得分:0)

此功能的本机签名,如MSDN上所示:

WINOLEAPI CreateILockBytesOnHGlobal(
  _In_   HGLOBAL hGlobal,
  _In_   BOOL fDeleteOnRelease,
  _Out_  ILockBytes **ppLkbyt
);

您已翻译为:

[DllImport("ole32.dll")]
static extern IntPtr CreateILockBytesOnHGlobal (
    IntPtr hGlobal,
    [MarshalAs(UnmanagedType.U1)] bool fDeleteOnRelease,
    out ILockBytes ppLkbyt
);

我看到以下问题:

  1. 返回值为HRESULT。这映射到int
  2. BOOL参数宽度为4个字节。这是你引用警告的主题。
  3. 现在,bool的默认编组是4字节Windows BOOL。所以你可以像这样修改声明:

    [DllImport("ole32.dll")]
    static extern int CreateILockBytesOnHGlobal (
        IntPtr hGlobal,
        bool fDeleteOnRelease,
        out ILockBytes ppLkbyt
    );