2012-08-15 42 views
3

我试图使用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()并通过引用传递结构。

我真的没有太多的经验做互操作(今天学会了堆试图找出这个!),所以我真的很感激推向正确的方向。 :)

回答

0

我也被花了几天在同样的问题,但没有任何结果。我能做到这一点运行检查没有任何错误,但即使是恶意软件,就返回OK状态,在我的情况下,最大

所以,我继续研究,发现Mozilla用来检查IAttachmentExecute防病毒API。和保存方法,它,做同样的工作,像 扫描IOfficeAntiVirus

IAttachmentExecute ::保存的可运行病毒扫描或其他信托 服务在保存前验证文件。请注意,这些 服务可以删除或更改文件。在codeples

和执行它http://antivirusscanner.codeplex.com/

+0

很高兴你明白了!我有五天的生活,我永远不会回来。 :) – Helephant 2015-07-18 13:50:12

0

我注意到的一件事是,你没有设置cbsize。 file.cbsize = Marshal.SizeOf(文件);

+0

感谢您的建议。我尝试过,但确实有所作为。 – Helephant 2012-08-16 08:42:52