我有这个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字节宽的替代方案?
答案 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
);
我看到以下问题:
HRESULT
。这映射到int
。BOOL
参数宽度为4个字节。这是你引用警告的主题。现在,bool
的默认编组是4字节Windows BOOL
。所以你可以像这样修改声明:
[DllImport("ole32.dll")]
static extern int CreateILockBytesOnHGlobal (
IntPtr hGlobal,
bool fDeleteOnRelease,
out ILockBytes ppLkbyt
);