我试图使用IOfficeAntiVirus COM interface调用使用Microsoft Security Essentials的病毒扫描程序扫描时。错误通过.NET COM调用一个方法互操作
我做早期绑定,因为文档中说,IOfficeAntiVirus接口从IUknown继承,不支持IDispatch接口。
[Guid("56FFCC30-D398-11d0-B2AE-00A0C908FA49"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface IOfficeAntiVirus
{
void Scan(IntPtr info);
}
[ComImport, Guid("2781761E-28E1-4109-99FE-B9D127C57AFE")]
class SecurityEssentialsAntiVirus
{
}
扫描方法的参数是来自this example的类型。该示例与我想要的相反,因为它使用.NET类实现IOfficeAntiVirus接口,而不是调用扫描方法。就我所知,示例中的编组和类型似乎为match the documentation。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MSOAVINFO
{
public int cbsize;
[MarshalAs(UnmanagedType.U4)]
public uint uFlags;
public IntPtr hwnd;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwzFullPath;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwzHostname;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwzOrigURL;
}
这是我想用来调用扫描方法的代码:它失败在调用的扫描方法
var antivirus = (IOfficeAntiVirus)new SecurityEssentialsAntiVirus();
var file = new MSOAVINFO();
file.pwzFullPath = @"test.txt";
IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(file));
Marshal.StructureToPtr(file, lParam, false);
antivirus.Scan(lParam);
。我得到的是说,一个例外:“尝试读取或写入保护内存这通常是一个 指示其他内存已损坏。”
我从一个64位系统上的32位命令行应用程序运行这个。我已经尝试过在32位和64位都运行命令行程序,但没有成功。
我敢肯定,IOfficeAntiVirus GUID是正确的,因为我从文档得到它。当我尝试将对象转换为接口时,还尝试使用不是COM接口的随机GUID导致错误。
我敢肯定,SecurityEssentialsAntiVirus GUID实现IOfficeAntiVirus因为当我试图铸造了不同类型的COM对象的该接口我得到了一个错误。
我认为这个问题可能是该接口上的扫描方法尚未正确声明(声明接口上的随机方法给出了同样的错误)。我不是从安全要领组件的文档开始工作,所以它可能不会以我想象的方式(或根本)实现接口。有没有人有任何想法如何检查?
我可以在其目录中看到一个MpOAv.dll文件,它与IOfficeAntiVirus文档中的头文件名称相同,我知道这并不是很多。我无法在ole-com对象查看器中打开该dll以查看里面的内容。我得到一个消息说:
的IMoniker :: BindToObject的失败,从创建的文件名字( “C:\ Program Files文件\ Microsoft安全客户端\ MpOAv.dll”)。坏 扩展名的文件
MK_E_INVALIDEXTENSION($ 800401E6)
这也可能是因为我没有正确地传递到结构的扫描方法。我尝试了大约一百个变种,没有任何运气,包括使用AllocCoTaskMem()并通过引用传递结构。
我真的没有太多的经验做互操作(今天学会了堆试图找出这个!),所以我真的很感激推向正确的方向。 :)
很高兴你明白了!我有五天的生活,我永远不会回来。 :) – Helephant 2015-07-18 13:50:12